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
Nguồn
2009-12-20 20:44:19