2013-06-23 3 views
0

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 

Что делает переменный «т» в типе означает. Я думал, что это должно быть примитивным типом в определении типа. Спасибо за объяснение.

ответ

3

В ocaml t - это соглашение о кодировании, используемое для обозначения типа, инкапсулированного определяющим модулем. В вашем примере кода t означает тип стека. Поскольку по умолчанию 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

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.

+0

um ... Я вижу. Благодарим за обмен знаниями. – yjasrc