2012-03-23 3 views
5

OCamlでインタフェースを作成する従来の方法は何ですか?インターフェイスファイルfoo.mliと実装ファイルfoo.mlを作成することで、1つの実装とのインターフェイスを持つことは可能ですが、同じインターフェイスに対して複数の実装を作成するにはどうすればよいですか?OCamlにおける複数の実装とのインタフェース

答えて

5

同じシグネチャに対して複数の実装を使用する場合は、コンパイル単位ではなくコンパイル単位内で、および必要に応じてモジュールで同様にシグネチャを定義します。その一例は、標準ライブラリにあります。その型のタイプと比較機能を持つモジュールを記述しOrderedType署名は、この署名はset.mlimap.mliの両方で定義されている

module type OrderedType = sig 
    type t 
    val compare : t -> t -> int 
end 

(あなたはそれを参照することができますSet.OrderedTypeまたはMap.OrderedTypeのいずれかとしてください。署名は構造的です)。標準ライブラリには、この署名(String,Nativeintなど)を持つコンパイル単位がいくつかあります。独自のモジュールを定義することもできます。モジュールを定義するときに特別な操作を行う必要はありません。タイプがtでの値がt -> t -> intである限り、そのモジュールにはそのシグニチャがあります。標準ライブラリには少し精巧な例があります:Set.Makeファンクタは、記号OrderedTypeを持つモジュールを作成します。そうすれば、そのようなセットのセットを構築できます。

(* All four modules passed as arguments to Set.Make have the signature Set.OrderedType *) 
module IntSet = Set.Make(module type t = int val compare = Pervasives.compare end) 
module StringSet = Set.Make(String) 
module StringSetSet = Set.Make(StringSet) 
module IntSetSet = Set.Make(IntSet) 
9

モジュールと署名を使用する必要があります。 .mlファイルは暗黙的にモジュールを定義し、.mliはその署名を定義します。明示的なモジュールと署名を使用すると、いくつかの異なるモジュールに署名を適用できます。

オンラインブックの「OCamlによるアプリケーションの開発」のthis chapterを参照してください。

+0

書籍のリンクをありがとうございました。それは1つより多くの点で非常に有用でした。 –

関連する問題