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