The*_*ema 10 polymorphism ocaml types
在ocaml语言规范中,有一个简短的部分:
poly-typexpr ::= typexpr
| { ' ident }+ . typexpr
Run Code Online (Sandbox Code Playgroud)
文中没有解释,唯一的例子poly-typexpr是定义方法类型:
method-type ::= method-name : poly-typexpr
Run Code Online (Sandbox Code Playgroud)
这让我能做什么?
Chr*_*way 14
poly-typexpr也允许作为记录字段的类型(参见第6.8.1节).这些通常被称为"存在类型",尽管在这一点上存在一些争论.以这种方式使用多态类型会更改类型变量的范围.例如,比较类型:
type 'a t = { f : 'a -> int; }
type u = { g : 'a. 'a -> int; }
Run Code Online (Sandbox Code Playgroud)
t实际上是一个类型的家族,每个可能的价值'a.类型的每个值'a t必须有一个字段f与类型'a -> int.例如:
# let x = { f = fun i -> i+1; } ;;
val x : int t = {f = <fun>}
# let y = { f = String.length; } ;;
val y : string t = {f = <fun>}
Run Code Online (Sandbox Code Playgroud)
相比之下,u是单一类型.每个类型的值u必须包含一个g类型'a -> int为any 的字段'a.例如:
# let z = { g = fun _ -> 0; } ;;
val z : u = {g = <fun>}
Run Code Online (Sandbox Code Playgroud)
请注意,这g完全不取决于其输入的类型; 如果确实如此,它就没有这种类型'a. 'a -> int.例如:
# let x2 = { g = fun i -> i+1; } ;;
This field value has type int -> int which is less general than 'a. 'a -> int
Run Code Online (Sandbox Code Playgroud)