Types OCaml中的多态递归对象类型
为什么在OCaml中不可能做到这一点:Types OCaml中的多态递归对象类型,types,ocaml,Types,Ocaml,为什么在OCaml中不可能做到这一点: type 'a cl = < f : 'b . 'b -> 'b cl >;; 那么,一般来说,是不可能有这样的对象,还是遗漏了一些特殊的语法?这条(令人惊讶的特定)消息意味着什么?在Ocaml中有两种形式的递归类型: 结构递归类型(也称为等递归)。当您仅仅定义一个类型同义词时,就会出现这种情况,就像您的例子一样。对于这些类型,递归必须是统一的,这意味着所有递归出现必须使用与左侧完全相同的参数。(您试图使方法多态的事实实际上与此无关。
type 'a cl = < f : 'b . 'b -> 'b cl >;;
那么,一般来说,是不可能有这样的对象,还是遗漏了一些特殊的语法?这条(令人惊讶的特定)消息意味着什么?在Ocaml中有两种形式的递归类型:
- 结构递归类型(也称为等递归)。当您仅仅定义一个类型同义词时,就会出现这种情况,就像您的例子一样。对于这些类型,递归必须是统一的,这意味着所有递归出现必须使用与左侧完全相同的参数。(您试图使方法多态的事实实际上与此无关。)
- 标称递归类型(也称为iso递归)。这些由具有数据构造函数的类型声明产生。在这种情况下,递归应用程序是不受限制的。例如:
type 'a t = C of 'a list t
type 'a cl = Cl of <f : 'b. 'b -> 'b cl>
type'a cl=cl'b cl>
然而,使用它显然有点冗长,因为您必须管理Cl
构造函数
type 'a cl = Cl of <f : 'b. 'b -> 'b cl>