2009-12-20 43 views
9

Trong đặc tả ngôn ngữ ocaml, có một đoạn ngắn:Loại ocaml 'a. 'a ->' có nghĩa là gì?

poly-typexpr ::= typexpr 
       | { ' ident }+ . typexpr 

Không có lời giải thích trong văn bản, và các trường hợp duy nhất của poly-typexpr là trong việc xác định một loại phương pháp:

method-type ::= method-name : poly-typexpr 

gì thực hiện điều này cho phép tôi làm gì?

Trả lời

12

poly-typexpr cũng được phép là loại trường bản ghi (xem Section 6.8.1). Chúng thường được gọi là "loại tồn tại", mặc dù có some debate on that point. Sử dụng một loại đa hình theo cách này thay đổi phạm vi của biến kiểu. Ví dụ, so sánh các loại:

type 'a t = { f : 'a -> int; } 
type u = { g : 'a. 'a -> int; } 

t thực sự là một gia đình các loại, một cho mỗi giá trị có thể có của 'a. Mỗi giá trị loại 'a t phải có một trường f với loại 'a -> int. Ví dụ:

# let x = { f = fun i -> i+1; } ;; 
val x : int t = {f = <fun>} 
# let y = { f = String.length; } ;; 
val y : string t = {f = <fun>} 

Khi so sánh, u là một loại duy nhất. Mỗi giá trị loại u phải có một trường g với loại 'a -> int cho bất kỳ'a. Ví dụ:

# let z = { g = fun _ -> 0; } ;; 
val z : u = {g = <fun>} 

Lưu ý ở đây rằng g không phụ thuộc vào loại đầu vào của nó; nếu có, nó sẽ không có loại 'a. 'a -> int. Ví dụ:

# let x2 = { g = fun i -> i+1; } ;; 
This field value has type int -> int which is less general than 'a. 'a -> int 
Các vấn đề liên quan