9

我正在尝试编写一个在另一个模块上实现算法的模块,该模块可以以各种方式实现。所以我的想法是将第一个模块写为

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

所以我显然在这里遗漏了一些东西,但我似乎无法解决这个问题。我将如何以完全不同的方式实现我想要的?

4

1 回答 1

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
于 2012-08-22T15:21:21.960 回答