OCaml中的多态递归对象类型

cho*_*ger 5 ocaml types

为什么在OCaml中这是不可能的:

type 'a cl = < f : 'b . 'b -> 'b cl >;;
Run Code Online (Sandbox Code Playgroud)

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

Error: In the definition of cl, type 'b cl should be 'a cl
Run Code Online (Sandbox Code Playgroud)

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

And*_*erg 8

Ocaml中有两种递归类型:

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

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

    type 'a t = C of 'a list t
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

type 'a cl = Cl of <f : 'b. 'b -> 'b cl>
Run Code Online (Sandbox Code Playgroud)

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