ちなみに正攻法は
参考: http://groups.google.co.jp/group/fa.caml/browse_thread/thread/75a8815a6b511e72/
上記コードを参考URLの正攻法で書き直すとこうなります。
module type P = sig type t val compare: t -> t -> int val create: unit -> t val empty: t end module F (A: P) = struct type t = A.t end module T (A: P) = struct module type S = module type of F(A) end
シグネチャを返すファンクタにするわけですね、正直目鱗。
ただこの方法は、シグネチャTを使う側にも変更が必要です。
module UseF (F: T) = struct ... end;;
↓
module UseF (A: P) (F: T (A).S) = struct ... end;;
純粋にファンクタの結果だけのシグネチャを得たい場合はダミーを用意する必要がありますが、実用上はこれで(変更が使う側に波及することと、Tを返すファンクタの引数がP以外にもバリエーションがあるケースに対応できないことを除けば)問題ないことが多いと思われます。というか私の手元コードの場合問題ありませんでしたので、ultrasuperdeluxmagicは消し消し。(苦労して編み出したのに……)