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
我在做什么错?
我希望我的函数参数'M'能够扩展'F.t',而其他变体没有在签名中指定;例如'type t = [\'Foo | \'巴兹]'。所以我不认为封闭式会起作用。我试图做甚至可能吗? 另外,我不清楚为什么开放类型包含一个类型变量 - 你能解释/链接到一个解释? RWO似乎没有提到任何有关隐式类型变量的内容。 – int3 2014-10-18 19:42:50
''type t = [>'Baz | M.t]''是你想要的;这里'M.t'可以关闭。 – camlspotter 2014-10-20 01:59:19
请注意,我使用的“隐式类型变量”不是官方的OCaml单词。在OCaml中,所有可实例化的对象都必须具有类型变量,包括开放多变类型''[>'A | 'B]''和打开的对象类型''。但是如果你不在别处使用它们,你可以省略写它们。它们实际上是一种用约束编写类型变量的简短方法:'''约束'a = [>'A | 'B]''和''约束'为'a = '。它们仅可实例化为其约束的子类型。 (你也可以像''一样'''''''''''''和''写成等效的形式。) –
camlspotter
2014-10-20 02:40:27