2016-05-18 7 views
5

私は自分自身で既存のモジュールを実装したいが、既存のモジュールと互換性のあるインターフェースを維持したい。私は既存のモジュールのためのモジュールタイプを持っておらず、インターフェースだけです。だから私はinclude Original_module私のインターフェイスで使用することはできません。インターフェイスからモジュールタイプを取得する方法はありますか?インターフェイスからモジュールタイプを取得するには?

たとえば、stdlibのListモジュールがあります。 とまったく同じ署名でMy_listモジュールを作成します。私はlist.mlimy_list.mliにコピーすることができましたが、それほど素晴らしいとは思われません。

答えて

5

、あなたは

include module type of struct include M end (* I call it OCaml keyword mantra *) 
を使用する必要があります

なく

include module type of M 

後者は、そのoriginaとデータ型の等式をドロップするのでlsはMで定義されています。

差がocamlc -i xxx.mliによって観察することができる。

include module type of struct include Complex end 

は、次のタイプの定義を有する:

type t = Complex.t = { re : float; im : float; } 

tが元Complex.tの別名であることを意味します。一方

include module type of Complex 

はそれがComplex.t異なるタイプとなり、Complex.tとの関係がなければ

type t = { re : float; im : float; } 

を持っている:あなたは、元のモジュールと、あなたの拡張版を使用してコードを混在させることはできませんincludeハックなし。これは通常あなたが望むものではありません。

+0

最初に対応する実装 'm.ml'が存在しない場合、既存のインタフェースファイル 'm.mli'に対してモジュール' my_m.ml'を実装できますか? – Yawar

2

あなたはRWOを見ることができます:あなたは別のMLIファイル(List.mliのような)モジュールのタイプを含める場合:いくつかのケースでは

include (module type of List) 
関連する問題