尝试编译
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
我做错了什么?
答案 0 :(得分:5)
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]
答案 1 :(得分:0)
这似乎可行:
module F ( M : sig
type base_t = [ `Foo ]
type 'a t = [> base_t] as 'a
end) = struct
type t = [ M.base_t | `Bar ] M.t
end
M.base_t
已关闭,而M.t('a)
是多态的。 F
使用M.t
扩展的M.base_t
来构造'Bar
。
这里是reasonml try link,其中包括上面的OCaml和ReasonML语法片段,并证明它可以编译。