我遇到以下情况:
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
的通用仿函数,它会生成一个具有两个具体内容的模块。有没有办法轻松获得?
由于仿函数语法很奇怪,而且我还是新手,我不知道我问的问题是否可以用简单的方法解决。
提前致谢
答案 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
由两个模块V
和LOffset
参数化,各个签名Lattice_With_Isotropy.S
和{ {1}}。两个签名之间还有其他类型约束,Offsetmap.S
部分。