ちなみに正攻法は

参考: 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は消し消し。(苦労して編み出したのに……)