什么是ocaml类型'a.'a - >'一个意思?

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 -> intany 的字段'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)