2015-10-02 6 views
5

In OCaml, habe ich zwei Modultypen einen Typ definieren t:Wie werden OCaml-Modultypen (Signaturen), die denselben Typ definieren, zusammengeführt?

module type Asig = sig 
    type t 
    val a : t 
end 

module type Bsig = sig 
    type t 
    val b : t 
end 

Ich möchte verschmelzenden sie die Schaffung eines Modultyp automatisieren. Ich möchte ein Modultyp entspricht erstellen:

module type ABsig_manual = sig 
    type t 
    val a : t 
    val b : t 
end 

Ich versuchte

module type ABsig = sig 
    include Asig 
    include Bsig 
end 

aber irgendwie Error: Multiple definition of the type name t. Es scheint unmöglich, dem include eine Typbeschränkung hinzuzufügen, so dass ich feststecke.

Kontext: Ich habe ein Modul AB, die beide Signaturen nicht implementiert, und ich will es auf einen Funktor ernähren wie:

module MakeC(AB) = struct 
    type t = AB.t list 
    let c = [AB.a; AB.b] 
end 

module C = MakeC(AB) 

ich zwei Argumente wie in verwenden:

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) 

aber dies (ist hässlich und) skaliert nicht gut zu mehr Funktoren oder mehr Signaturen zum Zusammenführen.

So, Wie kann ich die Zusammenführung dieser beiden Modultypen automatisieren? Ich kann A und B nach Bedarf ändern, aber ich möchte sie getrennt halten. Vielleicht ist mein Ansatz auch völlig falsch, und in diesem Fall würde ich gerne Hinweise auf eine bessere Richtung haben.

Type sharing in OCaml - typechecker error ist verwandt, aber verschmelzen Module, nicht Modultypen. Hier

+0

Haben Sie darüber nachgedacht, auf der 'caml-list @ inria.fr' nachzufragen? –

Antwort

10

ist der Weg, es zu tun:

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 

Es heißt "destruktive Substitution" bezeichnet.

+3

Für zukünftige Referenz wird dies in "Sprachenerweiterungen", Absatz "Ersetzen einer Signatur" (http://caml.inria.fr/pub/docs/manual-ocaml/extn.html#sec234) dokumentiert, was erweitert, was ist beschrieben in "The OCaml Language", Abschnitt "Modultypen" (http://caml.inria.fr/pub/docs/manual-ocaml/modtypes.html). – jacquev6

Verwandte Themen