2010-08-21 39 views
10

J'ai la situation suivante:Foncteurs avec plusieurs arguments en OCaml

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

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

qui fonctionne très bien pour générer des modules de type M qui utilisent une implémentation spécifique des modules de type Something dans leur mise en œuvre.

Supposons maintenant que j'ai un autre module défini comme

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

qui a différentes implémentations

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

Le point de la question est que le module M doit être paramétrées sur deux choses maintenant: un Something module et un module AU de sorte que ce soit quelque chose comme

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

mais je voudrais avoir un foncteur générique qui donne un Something et donné un AU il produit un module avec les deux choses concrétisées. Y a-t-il un moyen d'obtenir cela facilement?

Étant donné que la syntaxe des foncteurs est assez étrange et que je suis encore jeune, je ne sais pas si ce que je demande peut être résolu d'une manière simple ou non.

Merci d'avance

Répondre

14

Oui, un foncteur peut avoir plusieurs arguments. La syntaxe est comme ceci:

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 

Le foncteur peut alors être appliqué avec Make_LOffset(V)(LOffset).

Dans cet exemple, pris du code existant pour vous assurer qu'il est syntaxiquement correct, Make_LOffset est paramétrées par deux modules V et , des signatures respectives Lattice_With_Isotropy.S et Offsetmap.S. Il existe des contraintes de type supplémentaires entre les deux signatures, la partie with type … and type ….

+0

Existe-t-il une syntaxe différente pour transmettre des arguments au foncteur? Make_LOffset (arg1 arg2)? – stumped

+0

@stumped Bien les arguments seraient module, donc ils ressembleraient 'Arg1' et' Arg2'. La syntaxe est 'Make_LOffset (Arg1) (Arg2)'. J'ai mis à jour la réponse. –