采用多态变体类型的OCaml函子

采用多态变体类型的OCaml函子,ocaml,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 我做错了什么?类型t=[>`Foo]无效,因为[>`Foo]是开放类型,并且隐

试图编译

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

我做错了什么?

类型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]
这似乎有效:

模块F(M:sig
键入base_t=[`Foo]
键入'at=[>base\u t]作为'a
结束)=结构
类型t=[M.base_t | `Bar]M.t
结束
M.base\u t
是关闭的,而
M.t('a)
是多态的
F
使用
M.base\U t
扩展的
条形图构建
M.t


这里是,它包括上面OCaml和ReasonML语法中的代码段,并证明它可以编译。

我希望我的函子参数
M
能够扩展
F.t
,并在签名中未指定其他变量;e、 g.
类型t=[`Foo |`Baz]
。所以我认为一个封闭的类型是行不通的。我想做的事可能吗?另外,我不清楚为什么open类型包含类型变量——您能解释/链接到解释吗?RWO似乎没有提到任何关于隐式类型变量的内容。
typet=[>`Baz | M.t]
是您想要的;这里可以关闭
M.t
。请注意,我使用的“隐式类型变量”不是正式的OCaml单词。在OCaml中,所有可实例化的对象都必须具有类型变量,包括开放式多变量类型
[>`A |`B]
和开放式对象类型
。但是如果你不在其他地方使用它们,你可以省略它们。它们实际上是编写带有约束的类型变量的简短方法:
'a constraint'a=[>`a |`B]
'a constraint as'a=
。它们只能实例化到其约束的子类型。(你也可以把类似的
[>`A |`B]写成'A
写成'A
)恐怕不行<如果您想编写
[>`A | M.t]
,则code>M.t
似乎已关闭。顺便说一句,我认为你不需要将
M.t
定义为opened,因为从一个封闭的类型生成一个开放的多变量类型是非常容易的,就像
[>M.t]
一样。有没有材料解释
[>`a |`B]
'a constraint'a=[>`a |`B]
的缩写是如何工作的,尤其是当它与封闭类型交互时?