当我查看堆栈的内置类型定义时:
(*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”是什么意思。我认为它应该只是类型定义中的原始类型。谢谢你解释。
答案 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_stack
是Stack.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
。