2010-08-21 15 views
10

He la siguiente situación:Functors con múltiples argumentos 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 

que funciona bien para generar módulos de M tipo que utilizan la aplicación específica de los módulos de tipo Something dentro de su aplicación.

Ahora supongamos que tengo otro módulo definido como

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

que tiene varias implementaciones

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

El punto de la cuestión es que el módulo M debe ser parametrizada en dos cosas ahora: un Something módulo y un módulo AU para que sea algo así como

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

pero me gustaría tener un functor genérico que, dado un Something y dado un AU, produzca un módulo con ambas cosas concretizadas. ¿Hay alguna manera de obtener eso fácilmente?

Como la sintaxis de functor es bastante extraña y todavía soy nuevo, no sé si lo que estoy pidiendo se puede resolver de una manera sencilla o no.

Gracias de antemano

Respuesta

14

Sí, un functor puede tener varios argumentos. La sintaxis es la siguiente:

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 

El funtor continuación, se puede aplicar con Make_LOffset(V)(LOffset).

En este ejemplo, tomado de código existente para asegurarse de que es sintácticamente correcto, Make_LOffset está parametrizado por dos módulos V y , de las firmas respectivas Lattice_With_Isotropy.S y Offsetmap.S. Hay restricciones de tipo adicionales entre las dos firmas, la parte with type … and type ….

+0

¿Hay una sintaxis diferente para pasar argumentos al funtor? Make_LOffset (arg1 arg2)? – stumped

+0

@stumped Bueno, los argumentos serían del módulo, por lo que se verían como 'Arg1' y' Arg2'. La sintaxis es 'Make_LOffset (Arg1) (Arg2)'. He actualizado la respuesta. –

Cuestiones relacionadas