2010-08-21 17 views
10

Ich habe die folgende Situation:Funktoren mit mehreren Argumenten in OCaml

module type M = sig type s = ... end 

module Make(P: Something) : (M with type s = P.t) = struct 
    type s = P.t 
    ... 
end 

, die zur Erzeugung von Modulen M Art funktioniert gut, die spezifische Implementierung von Modulen des Typs verwenden Something innerhalb deren Umsetzung.

Nehmen wir nun an habe ich ein anderes Modul definiert als

module type AU = sig 
    val feed : float -> unitv 
    val nth : int -> (float -> float) 
    val reset : unit -> unit 
end 

, dass verschiedene Implementierungen

module SUAlg : AU = struct ... end 
module MLAlg : AU = struct ... end 
module ACEAlg : AU = struct ... end 

Der Punkt der Frage hat, ist, dass das M Modul sollte jetzt über zwei Dinge parametrisiert werden: a Something Modul und ein AU Modul, so dass es so etwas wie

module Make(P: Something) : (M with type s = P.t) = struct 
    type s = P.t 
    module Alg = MLAlg (* just an example *) 
    ... 
end 
ist

aber ich hätte gerne einen generischen Funktor, der eine Something gegeben und eine AU gibt es ein Modul mit beiden Dingen konkretisiert. Gibt es einen Weg, das leicht zu erreichen?

Da Funktorsyntax ziemlich seltsam ist und ich noch neu bin, weiß ich nicht, ob das, was ich frage, auf einfache Weise gelöst werden kann oder nicht.

Vielen Dank im Voraus

Antwort

14

Ja, kann ein Funktor mehrere Argumente haben. Die Syntax ist wie folgt:

module Make_LOffset 
      (V:Lattice_With_Isotropy.S) 
      (LOffset : Offsetmap.S with type y = V.t and type widen_hint = V.widen_hint) = 
struct 
    … 
end 

Der Funktors kann dann mit Make_LOffset(V)(LOffset) angewandt werden.

In diesem Beispiel aus vorhandenen Code genommen, um sicherzustellen, es syntaktisch korrekt ist, wird Make_LOffset parametriert von zwei Modulen V und , des jeweiligen Signaturen Lattice_With_Isotropy.S und Offsetmap.S. Zwischen den beiden Signaturen, dem with type … and type …-Teil, gibt es zusätzliche Typenzwänge.

+0

Gibt es eine andere Syntax für die Übergabe von Argumenten in den Funktor? Make_LOffset (arg1 arg2)? – stumped

+0

@stumped Nun, die Argumente wären Modul, also würden sie wie "Arg1" und "Arg2" aussehen. Die Syntax lautet 'Make_LOffset (Arg1) (Arg2)'. Ich habe die Antwort aktualisiert. –

Verwandte Themen