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

标签 types polymorphism ocaml

在ocaml语言规范中,有一小段内容:

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

文本中没有任何解释,并且poly-typexpr的唯一实例是定义方法类型:
method-type ::= method-name : poly-typexpr

这允许我做什么?

最佳答案

还可以将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

关于types - ocaml类型 'a. ' a->'a是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1936534/

相关文章:

C++:使用传入的字符串参数访问类型中的内容

c++ - 新表达式会返回一个指向数组的指针吗?

c# - 将 95 阶乘打印为数字而不是指数函数

c++ - 如何安全地向下转换 USTRUCT

OCaml 用户定义类型模式匹配

Ocaml 打印元组列表

oop - 无法从另一个实例变量的定义中访问实例变量 super

python - 在 Python 中找出代理类型(http,socks 4/5)?

functional-programming - 如何在标准 ML 中打印多态值?

java - 使用多态参数覆盖方法