2010-08-21 67 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 

工作正常生成用具體的實施及其實施內部Something類型的模塊,M類型的模塊。

現在假設我有另外一個模塊定義爲

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.SOffsetmap.S的。兩個簽名之間還有其他類型限制,即with type … and type …部分。

+0

是否有將參數傳遞給函子的不同語法? Make_LOffset(arg1 arg2)? – stumped 2016-10-06 16:38:17

+0

@stumped那麼參數將會是模塊,所以它們看起來像'Arg1'和'Arg2'。語法是'Make_LOffset(Arg1)(Arg2)'。我已經更新了答案。 – 2016-10-06 19:56:28