OCamlで相互再帰的なモジュール定義を使用する場合は、ファイル内であっても署名を付ける必要があり.ml
ます。.mli
これは、署名を2回繰り返すことになり、から特定のインターフェイスを公開したいという煩わしさです。:(!
module rec Client : sig
type ('serv,'cli) t
(* functions ... *)
end = struct
type ('serv,'cli) t =
{ server: ('serv,'cli) Server.t
; (* other members ... *)
}
end
and Server : sig
type ('serv,'cli) t
(* functions ... *)
end = struct
type ('serv,'cli) t =
{ mutable clients: ('serv,'cli) Client.t list
; mutable state: 'serv
}
(* functions again ... *)
end
これは私が行っていることの大まかな概算です(Client
タイプオブジェクトはServer
それらをインスタンス化したものを知っています。sはそれらをServer
知っていますClient
)。
もちろん、署名はで繰り返されます.mli
。なぜこれが必要なのですか?
(注:私は文句を言っていませんが、実際には、型理論または「ハードコンパイラの問題」に関連する理由があるかどうかを知りたいです。)