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

How to override type definition while using module include in 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;;

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

您的模块 B 等同于

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

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

我们不知道您所说的 "extend" 是什么意思,但是如果您希望通过 include 通过额外的构造函数 U 获得与 A 相同的模块,例如来自

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

,就是不行。

您不能按您想要的方式扩展代数类型。

可以扩展多态变体类型:

# 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' 作为第二种类型的名称。