我正在尝试编写一个在另一个模块上实现算法的模块,该模块可以以各种方式实现。所以我的想法是将第一个模块写为
module type Base = sig
type t
val f : t -> t
end
然后我编写了第二个模块,该模块通过与以下兼容的模块进行参数化Base
:
module type BasedOnBase = functor (B : Base) -> sig
type b
val g : B.t -> b
end
现在我正在尝试编写一个在兼容的模块上参数化的模块,BasedOnBase
这就是我卡住的地方。我天真的方法不起作用,我试过了
(* won't compile *)
module type Alg = functor (BoB : BasedOnBase) -> sig
val h : BoB.b -> bool
end
也
(* won't compile *)
module type Alg = functor (BoB : functor (B : Base) -> BasedOnBase) -> sig
val h : BoB.b -> bool
end
但两次尝试都会导致此错误:
[...]
Error: Unbound type constructor BoB.b
所以我显然在这里遗漏了一些东西,但我似乎无法解决这个问题。我将如何以完全不同的方式实现我想要的?