2015-10-02 10 views
5

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.

+0

Czy rozważałeś pytanie na 'caml-list @ inria.fr'? –

Odpowiedz

10

Oto sposób, aby to zrobić:

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 

To się nazywa "destrukcyjny podstawienie".

+3

W celu późniejszego wykorzystania, jest to udokumentowane w "Rozszerzeniach językowych", akapit "Zastąpienie podpisem" (http://caml.inria.fr/pub/docs/manual-ocaml/extn.html#sec234), co rozszerza zakres opisane w "The OCaml Language", akapit "Typy modułów" (http://caml.inria.fr/pub/docs/manual-ocaml/modtypes.html). – jacquev6

Powiązane problemy