如何合并定义相同类型的OCaml模块类型(签名)?

时间:2015-10-02 16:36:15

标签: ocaml

在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,但我希望将它们分开。此外,也许我的方法是完全错误的,在这种情况下,我喜欢指向更好的方向。

Type sharing in OCaml - typechecker error是相关的,但合并模块,而不是模块类型。

1 个答案:

答案 0 :(得分:15)

以下是这样做的方法:

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

它被称为"破坏性替代"。