У меня есть следующая ситуация:
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
но я хотел бы иметь общий функтор, заданный a Something
и заданный AU
, он создает модуль с обеими конкретизированными вещами. Есть ли способ получить это легко?
Поскольку функциональный синтаксис довольно странный, и я все еще новичок в этом, я не знаю, может ли то, что я прошу, решить простым способом или нет.
Заранее спасибо