在OCaml中,我有两个模块类型来定义类型
我希望自动化创建合并模块类型。我想要创建一个等同于以下模块类型的模块:
但是,使用时会出现“
上下文:我有一个模块
但是这种方式(丑陋且)无法很好地扩展到更多的函子或要合并的签名。那么,我该如何自动合并这两种模块类型? 我可以根据需要修改A和B,但我想保持它们分开。此外,也许我的方法完全错误,如果是这种情况,我希望能获得更好方向的指引。OCaml中的类型共享-类型检查器错误与此相关,但合并的是模块而不是模块类型。
t
:module type Asig = sig
type t
val a : t
end
module type Bsig = sig
type t
val b : t
end
我希望自动化创建合并模块类型。我想要创建一个等同于以下模块类型的模块:
module type ABsig_manual = sig
type t
val a : t
val b : t
end
我尝试过
module type ABsig = sig
include Asig
include Bsig
end
但是,使用时会出现“
Error: Multiple definition of the type name t
”错误。似乎无法对include
添加类型约束,所以我被卡住了。上下文:我有一个模块
AB
,它实现了这两个签名,我想将其提供给一个类似于函数的装置。module MakeC(AB) = struct
type t = AB.t list
let c = [AB.a; AB.b]
end
module C = MakeC(AB)
我可以像这样使用两个参数:
module UglyMakeC(A : Asig)(B : Bsig with type t = A.t) = struct
type t = A.t list
let c = [A.a; B.b]
end
module C = UglyMakeC(AB)(AB)
但是这种方式(丑陋且)无法很好地扩展到更多的函子或要合并的签名。那么,我该如何自动合并这两种模块类型? 我可以根据需要修改A和B,但我想保持它们分开。此外,也许我的方法完全错误,如果是这种情况,我希望能获得更好方向的指引。OCaml中的类型共享-类型检查器错误与此相关,但合并的是模块而不是模块类型。
caml-list@inria.fr
上询问吗? - Basile Starynkevitch