2014-10-18 18 views
3

试图编译OCaml的仿函数取多态性变异型

module F (M : sig 
    type t = [> `Foo ] 
end) = struct 
    type t = [ M.t | `Bar ] 
end 

让我

Error: A type variable is unbound in this type declaration. 
In type [> `Foo ] as 'a the variable 'a is unbound 

我在做什么错?

回答

4

type t = [> `Foo]无效,因为[> `Foo]是一个开放的类型,并且隐含地包含一个类型变量。该定义被拒绝,就像下面的类型定义被拒绝,因为RHS具有未在LHS量化类型变量:

type t = 'a list 

你必须要关闭它:

type t = [ `Foo ] 

或量化类型的变量:

type 'a t = [> `Foo] as 'a 

这相当于

type 'a t = 'a constraint 'a = [> `Foo] 
+0

我希望我的函数参数'M'能够扩展'F.t',而其他变体没有在签名中指定;例如'type t = [\'Foo | \'巴兹]'。所以我不认为封闭式会起作用。我试图做甚至可能吗? 另外,我不清楚为什么开放类型包含一个类型变量 - 你能解释/链接到一个解释? RWO似乎没有提到任何有关隐式类型变量的内容。 – int3 2014-10-18 19:42:50

+0

''type t = [>'Baz | M.t]''是你想要的;这里'M.t'可以关闭。 – camlspotter 2014-10-20 01:59:19

+0

请注意,我使用的“隐式类型变量”不是官方的OCaml单词。在OCaml中,所有可实例化的对象都必须具有类型变量,包括开放多变类型''[>'A | 'B]''和打开的对象类型''。但是如果你不在别处使用它们,你可以省略写它们。它们实际上是一种用约束编写类型变量的简短方法:'''约束'a = [>'A | 'B]''和''约束'为'a = '。它们仅可实例化为其约束的子类型。 (你也可以像''一样'''''''''''''和''写成等效的形式。) – camlspotter 2014-10-20 02:40:27