9

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。なぜこれが必要なのですか?

(注:私は文句を言っていませんが、実際には、型理論または「ハードコンパイラの問題」に関連する理由があるかどうかを知りたいです。)

4

2 に答える 2

7

私の知る限り、これを回避する方法はありません。非常に高いレベルでは、コンパイラに関する限り、クライアントの型署名はサーバーの型署名を知るまで不完全であり、その逆も同様です。原則として、これを回避する方法があります。コンパイラは、コンパイル時に .mli ファイルを相互参照できます。しかし、このアプローチには欠点があります。コンパイラとリンカの責任の一部が混在し、モジュラー コンパイル (しゃれは意図されていません) がより困難になります。

興味があれば、再帰モジュールに関する Xavier Leroy の最初の提案をお勧めします。

于 2011-01-20T05:16:14.587 に答える
4

私の推測: 再帰モジュールをコンパイルするために、コンパイラは実装のための型注釈を必要とします。mli ファイル (使用している場合) では、これらのモジュールの型をさらに制限したり、完全に非表示にしたりすることができるため、一般に、型再帰を解決する mli wrt で有用な型を見つけることをコンパイラが期待することは賢明ではありません。

于 2011-01-20T08:32:34.273 に答える