OCamlで相互に再帰的なモジュール定義を使用する場合は、.ml
ファイルでも署名をする必要があります。これは、私が.mli
から与えられたインタフェースを公開したいという厄介なことです。私は署名を2回繰り返すことになります。 :(!なぜOCamlで相互に再帰的なモジュールの署名が必要なのですか?
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
を知っている。Server
sが彼らのClient
のを知っている)。もちろん
、署名があります。.mli
で繰り返さなぜこれが必要である
(注:私は文句はないんだけど、実際に型理論または「ハードコンパイラの問題」は、このための関連の理由があるかどうかを知りたい)?
それは理にかなっています。確かに、私は '.mli'の外部の消費者に違うタイプのシグネチャを公開することでこの"機能 "を利用しています。私は実現したはずです。 – Ashe
良い推測です。相互に帰納的なモジュールやファンクタの場合の推論は一般的に決めることができないので、型の注釈が必要です。文献には、最小限のアノテーション要件を最適化し、健全性を保持するように型システムを改良する試みがいっぱいです。アノテーション要件の負担を軽減するためにOCamlの型システムを改善できるかどうかは議論の余地があります。 –