2014-02-27 63 views
5

到底为什么这是不可能OCaml中:多态递归对象类型OCaml中

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

从我迄今所看到的,通用的量化类型被允许在对象类型,但我的翻译产量:

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

那么,通常不可能有这种类型的对象,或者我会错过一些特殊的语法吗?那(意外的具体)消息是什么意思?

回答

8

有递归类型的两种形式OCaml中:

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

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

    type 'a t = C of 'a list t 
    

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

在标称情况下,不会出现此问题,因为它们定义了新的类型,其定义从不隐式展开。支付的价格是你必须通过应用或匹配他们的一个数据构造函数来“强制”(更精确地说,注入和项目)显式地进出这些类型。

编辑:那么,你可以尝试定义类型作为数据类型:

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

然而,显然是在利用这有点冗长,因为你要管理Cl构造。