OCaml仿函数采用多态变体类型

时间:2014-10-18 07:46:24

标签: 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

我做错了什么?

2 个答案:

答案 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语法片段,并证明它可以编译。