我正在尝试编写一个在另一个模块上实现算法的模块,该模块可以通过各种方式实现。所以我的想法是将第一个模块写成
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
所以我显然在这里遗漏了一些东西,但我似乎无法理解这个问题。我将如何以完全不同的方式实现我想要的目标?
答案 0 :(得分:8)
你可以这样写:
module type Alg = functor (BoB : BasedOnBase) -> functor (B:Base) -> sig
type t
val h : t -> bool
end with type t = BoB(B).b
使用此功能,您需要在实例化B:Base
类型的模块时传递模块Alg
,这在您的问题中并非如此。
编辑:甚至是:
module type Alg =
functor (BoB : BasedOnBase) ->
functor (B : Base) -> sig
val h : BoB(B).b -> bool
end