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