2010-08-21 2 views
10

Я такая ситуация:функторов с несколькими аргументами в OCaml

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

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

работает отлично для создания модулей M типа, которые используют конкретную реализацию модулей типа Something внутри их реализации.

Теперь предположим, что я другой модуль определяется как

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

, который имеет различные реализации

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

Суть вопроса состоит в том, что M модуль должен быть параметризованных над двумя вещами теперь: а Something модуль и модуль AU, так что это что-то вроде

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

, но я хотел бы иметь общий функтор, который задал Something и дал AU, он производит модуль с обеими конкретизированными вещами. Есть ли способ получить это легко?

Поскольку синтаксис функтора довольно странный, и я все еще новичок в этом, я не знаю, может ли то, что я прошу, решить простым способом или нет.

Заранее благодарен

ответ

14

Да, функтор может иметь несколько аргументов. Синтаксис таков:

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 

функтор может быть применен с Make_LOffset(V)(LOffset).

В этом примере, взяты из существующего кода, чтобы гарантировать, что это синтаксически правильный, Make_LOffset параметризуется двумя модулями V и , соответствующих подписей Lattice_With_Isotropy.S и Offsetmap.S. Существуют дополнительные ограничения типа между двумя сигнатурами, часть with type … and type ….

+0

Есть ли другой синтаксис для передачи аргументов в функтор? Make_LOffset (arg1 arg2)? – stumped

+0

@stumped Ну аргументы будут модулем, поэтому они будут выглядеть как «Arg1» и «Arg2». Синтаксис: 'Make_LOffset (Arg1) (Arg2)'. Я обновил ответ. –