我想用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;;
然而,这是错误的。那我怎么能处理呢?
答案 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'
作为第二种类型的名称。