W SML, mam dwa typy modułów definiujących typ t
:Jak scalić typy modułów OCaml (sygnatury) definiujące ten sam typ?
module type Asig = sig
type t
val a : t
end
module type Bsig = sig
type t
val b : t
end
chcę zautomatyzować tworzenie typu modułu je łączących. Chcę utworzyć typ moduł odpowiadający:
module type ABsig_manual = sig
type t
val a : t
val b : t
end
Próbowałem
module type ABsig = sig
include Asig
include Bsig
end
ale to się nie powiedzie z Error: Multiple definition of the type name t
. Wydaje się niemożliwe, aby dodać ograniczenie typu do include
, więc utknąłem.
Kontekst: Mam moduł AB
który nie realizować oba podpisy i chcę karmić go do funktora jak:
module MakeC(AB) = struct
type t = AB.t list
let c = [AB.a; AB.b]
end
module C = MakeC(AB)
mogę użyć dwóch argumentów jak w:
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)
ale to (jest brzydkie i) nie skaluje się dobrze do większej liczby funktorów lub więcej podpisów, aby się scalić.
Tak, w jaki sposób mogę zautomatyzować łączenie tych dwóch typów modułów? Mogę zmodyfikować A i B w razie potrzeby, ale chcę je oddzielić. Być może moje podejście jest całkowicie błędne iw tym przypadku chciałbym wskazać lepszy kierunek.
Type sharing in OCaml - typechecker error jest powiązany, ale łączy moduły, a nie moduły.
Czy rozważałeś pytanie na 'caml-list @ inria.fr'? –