Как объединить типы модулей (подписи) 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 по мере необходимости, но я хочу держать их отдельно. Кроме того, возможно, мой подход совершенно неправильный, и в этом случае я бы хотел указатели в лучшем направлении.

Совместное использование типов в OCaml - ошибка проверки типов связан, но объединяет модули, а не типы модулей.

Ответы на вопрос(1)

Ваш ответ на вопрос