OCaml类型定义中的任何特殊含义

时间:2013-06-23 06:00:13

标签: types ocaml

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

(*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”是什么意思。我认为它应该只是类型定义中的原始类型。谢谢你解释。

2 个答案:

答案 0 :(得分:3)

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

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

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

此处empty_stackStack.t类型的变量,虽然是空堆栈。

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

 # let stack_func s:(int) Stack.t = s;;
   val stack_dummy : int Stack.t -> int Stack.t = <fun>

答案 1 :(得分: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的同义词。第二种类型在定义中有一个名为&#39; a的参数。第三个与第二个相同,只是类型名为t而不是sequence