は、モジュールがモジュールタイプの近似値で作られた環境の中でチェックされていることを書かれています); B→約(B)。 C - > approx(C)}が最初に構築され、A、B、Cの型を計算するために使用されます。入力して再帰的なモジュールのOCamlで入力されている方法を再帰的なモジュールの<a href="http://caml.inria.fr/pub/papers/xleroy-recursive_modules-03.pdf" rel="noreferrer">Leroy's paper</a>で
近似が十分でなく、型検査が失敗することがあります。特に、コンパイル単位のソースを再帰的なモジュール定義に入れると、型チェックが失敗する可能性がありますが、コンパイラはコンパイル単位を別々にコンパイルできました。
私の最初の例に戻って、最初の近似環境ではA型を入力するが、Aの新しい計算型で拡張された初期環境でB型を入力し、以前のenvにBの新しい計算タイプが追加されました。
詳細を調べる前に、再帰的なモジュールのコンパイルスキームが安全か危険かを示す、この件に関する事前の作業があるかどうかを知りたいと思いますか?このスキームで正しく入力された安全でないプログラムを示す反例がありますか?
非常に興味深い質問、確かに。あなたの提案する解決法は、Aの型がBとCの型に依存する可能性があることを無視していることに注意してください。そうでなければ、(依存関係の順序ではなく)それらを一緒にチェックする必要はありません。 – Ingo
実際、AのタイプはBとCに依存することができますが、その場合はBとCの近似で十分です。私の質問は実際の例に由来しています。私はこの解決策をコンパイラに書いて解決しました。プログラムは安全でした(再帰型のコンパイル単位で構成されています)ので、パッチは安全ですか?一般的なケース。 –