问题描述
在OCaml中,我有两种定义类型t
的模块类型:
In OCaml, I have two module types defining a type t
:
module type Asig = sig
type t
val a : t
end
module type Bsig = sig
type t
val b : t
end
我想自动创建合并它们的模块类型.我想创建一个等效于以下模块的类型:
I want to automate the creation of a module type merging them. I want to create a module type equivalent to:
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
中添加类型约束,所以我被困住了.
but this fails with Error: Multiple definition of the type name t
. It seems impossible to add a type constraint to the include
so I'm stuck.
上下文:我有一个模块AB
,它确实实现了两个签名,我想将其提供给仿函数,例如:
Context: I have a module AB
that does implement both signatures and I want to feed it to a functor like:
module MakeC(AB) = struct
type t = AB.t list
let c = [AB.a; AB.b]
end
module C = MakeC(AB)
我可以使用两个参数,例如:
I could use two arguments like in:
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)
但这很丑陋,无法很好地扩展到更多函子或更多签名以进行合并.
but this (is ugly and) doesn't scale well to more functors or more signatures to merge.
那么,如何自动合并这两种模块类型?我可以根据需要修改A和B,但我想将它们分开.另外,也许我的方法是完全错误的,在那种情况下,我希望指针指向一个更好的方向.
So, how can I automate merging those two module types? I can modify A and B as needed but I want to keep them separated. Also, maybe my approach is completely wrong, and in that case I'd love pointers to a better direction.
OCaml中的类型共享-类型检查器错误是相关的,但是合并模块,而不是模块类型.
Type sharing in OCaml - typechecker error is related but merges modules, not module types.
推荐答案
这是实现此目的的方法:
Here is the way to do it :
module type Asig = sig
type t
val a : t
end
module type Bsig = sig
type t
val b : t
end
module type ABsig = sig
include Asig
include Bsig with type t := t
end
它被称为破坏性替代".
It's called "destructive substitution".
这篇关于如何合并定义相同类型的OCaml模块类型(签名)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!