9

さまざまな方法で実装できる別のモジュールにアルゴリズムを実装するモジュールを作成しようとしています。だから私の考えは、最初のモジュールを次のように書くことでした

module type Base = sig
  type t
  val f : t -> t
end

次に、互換性のあるモジュールを介してパラメータ化された 2 番目のモジュールを作成します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これにより、 type のモジュールをインスタンス化するときにモジュールを渡す必要がありますがAlg、これはあなたの質問には当てはまりません。

編集:またはこれでも:

module type Alg =
  functor (BoB : BasedOnBase) ->
  functor (B : Base) -> sig
    val h : BoB(B).b -> bool
  end
于 2012-08-22T15:21:21.960 に答える