OCaml中具有多个参数的函子

时间:2010-08-21 13:57:01

标签: module ocaml functor

我遇到以下情况:

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的通用仿函数,它会生成一个具有两个具体内容的模块。有没有办法轻松获得?

由于仿函数语法很奇怪,而且我还是新手,我不知道我问的问题是否可以用简单的方法解决。

提前致谢

1 个答案:

答案 0 :(得分:17)

是的,仿函数可以有几个参数。语法如下:

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由两个模块VLOffset参数化,各个签名Lattice_With_Isotropy.S和{ {1}}。两个签名之间还有其他类型约束,Offsetmap.S部分。