如何在OCaml中使用模块包含时覆盖类型定义?

时间:2015-03-18 07:25:49

标签: include override ocaml

我想用include指令扩展一个模块。假设我有一个模块A:

module A = struct
  type t = |T of int
end;;

然后按如下方式扩展:

module B = struct
  include A
  type t = |T of int |U of string
end;;

然而,这是错误的。那我怎么能处理呢?

2 个答案:

答案 0 :(得分:1)

您的模块B

等效
module B = struct
  type t = T of int
  type t = T of int | U of string
end;;

其中在一个模块中声明了两种相同名称的类型。这在OCaml中是不可能的,这就是它无法编译的原因。

我们不知道“延伸”是什么意思,但如果您希望通过A获得与U相同的模块以及额外的构造函数include,例如来自< / p>

module A = struct
  type t = T of int
  let example_of_t = T 0
end

获得与

等价的模块
module B = struct
  type t = T of int | U of string
  let example_of_t = T 0
end

,它只是不起作用。

答案 1 :(得分:1)

您无法按照自己的方式扩展代数类型。

可以扩展多态变体类型:

# type abc = [ `A | `B | `C ];;
type abc = [ `A | `B | `C ]
# type def = [ abc | `D | `E | `F ];;
type def = [ `A | `B | `C | `D | `E | `F ]

也许这接近你想要的。

但是,您仍然无法在同一范围内使用两个具有相同名称的类型。因此,您可能希望使用t'作为第二种类型的名称。