OCaml类型'a. 'a -> 'a是什么意思?

10
在 ocaml 语言规范中,有一小节:
poly-typexpr ::= typexpr
               | { ' ident }+ . typexpr

这段文本中没有解释,而且poly-typexpr的唯一实例是在定义方法类型时:

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

这让我可以做什么?

2个回答

14

poly-typexpr也可以作为记录字段的类型(参见第6.8.1节)。这些通常被称为“存在类型”,尽管在这一点上存在一些争议。以这种方式使用多态类型会改变类型变量的范围。例如,比较以下类型:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接