什么是ocaml类型'a。 'a - > '一个平均值?

时间:2009-12-20 18:23:45

标签: types polymorphism ocaml

在ocaml语言规范中,有一个简短的部分:

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

文中没有解释,poly-typexpr的唯一实例是定义方法类型:

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

这让我能做什么?

2 个答案:

答案 0 :(得分:12)

poly-typexpr也被允许作为记录字段的类型(请参阅Section 6.8.1)。这些通常被称为“存在类型”,尽管有some debate on that point。以这种方式使用多态类型会更改类型变量的范围。例如,比较类型:

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

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>}

相比之下,u是单一类型。类型u的每个值都必须包含字段g,其中任何 'a -> int的类型为'a。例如:

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

请注意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

答案 1 :(得分:1)

section 3.11 "Polymorphic methods"。向下滚动到“当然约束也可以是显式方法类型......”