OCaml中的多态递归对象类型

时间:2014-02-27 18:17:33

标签: types ocaml

为什么在OCaml中无法做到这一点:

type 'a cl = < f : 'b . 'b -> 'b cl >;;

从目前为止我所看到的,对象类型中允许使用通用量化类型,但我的解释器产生:

Error: In the definition of cl, type 'b cl should be 'a cl

那么,通常不可能有这种对象或者我是否会错过一些特殊的语法?那个(令人惊讶的具体)消息是什么意思?

1 个答案:

答案 0 :(得分:8)

Ocaml中有两种递归类型:

  • 结构递归类型(也称为 equi-recursive )。当您只定义类型同义词时会出现这种情况,就像您的情况一样。对于这些类型,递归必须是 uniform ,这意味着所有递归出现必须使用与左侧完全相同的参数。 (事实上​​,您尝试使该方法具有多态性实际上是无关紧要的。)

  • 标称递归类型(也称为 iso-recursive )。这些来自具有数据构造函数的类型声明。在这种情况下,递归应用程序不受限制。例如:

    type 'a t = C of 'a list t
    

第一种情况下限制的原因是结构类型定义总是被它们的定义所取代(至少在概念上)。如果递归不一致,那么这种展开可能是无限大的(从技术上讲,这样的定义会描述不再是常规树的类型)。

在名义上的情况下,不会出现此问题,因为它们定义了 new 类型,其定义永远不会隐式展开。需要付出的代价是,您必须通过应用或匹配其中一个数据构造函数,明确地“强制”(更准确地说,注入和投射)这些类型。

编辑:所以,您可以尝试将类型定义为数据类型:

type 'a cl = Cl of <f : 'b. 'b -> 'b cl>

然而,使用它显然有点冗长,因为你必须管理Cl构造函数。