0

当我查看堆栈的内置类型定义时:

(*ocaml-2.04/stdlib/stack.ml*)
type 'a t = { mutable c : 'a list }  (*What does t mean here*)
exception Empty
let create () = { c = [] }
let clear s = s.c <- []
let push x s = s.c <- x :: s.c
let pop s = match s.c with hd::tl -> s.c <- tl; hd | [] -> raise Empty
let length s = List.length s.c
let iter f s = List.iter f s.c

类型中的变量“t”是什么意思。我认为它应该只是类型定义中的原始类型。谢谢你的解释。

4

2 回答 2

3

在 ocamlt中是用于表示定义模块封装的类型的编码约定。在您的代码示例中,t表示 Stack 类型。由于默认情况下 ocaml 采用模块文件的名称,t因此称为 Stack.t。

要查看其用法,请在 ocaml toplevel(REPL) 中键入以下内容并查看输出。

  # let emtpy_stack = Stack.create();;
    val empty_stack : '_a Stack.t = <abstr>

empty_stack是一个类型的变量,Stack.t尽管是一个空堆栈。

另外,假设你想定义一个Stack作为参数的函数;这是使用类型注释定义它的一种方法,

 # let stack_func s:(int) Stack.t = s;;
   val stack_dummy : int Stack.t -> int Stack.t = <fun>
于 2013-06-23T10:34:15.730 回答
1

t是正在定义的类型的名称。它是一种带有一个参数的参数化类型。在定义中,参数(所谓的形参)被命名为'a

它可能只是看起来很有趣,因为它是一个字符的名字:-)

也许这些例子将有助于澄清:

 # type intsequence = int list;;
 type intsequence = int list
 # type 'a sequence = 'a list;;
 type 'a sequence = 'a list
 # type 'a t = 'a list;;
 type 'a t = 'a list
 # 

第一种类型没有参数。它只是 的同义词int list。第二种类型a在定义中有一个名为 ' 的参数。第三个与第二个相同,只是类型被命名t而不是sequence.

于 2013-06-23T06:51:57.903 回答