2011-11-13 9 views
1

ABの2つのモジュールを設計したいと思います。どちらも独自の機能を持っています。A.compare: A.t -> A.t -> boolB.compare: B.t -> B.t -> boolなどです。 ABの要素は変換可能です。だから私はまた、関数a_of_b : B.t -> A.tb_of_a : A.t -> B.tが必要になります。私の質問は、これらの機能をどこで定義すべきかです。 AまたはBのいずれかの構造内にあるか、他の場所ですか?Ocamlの2つのインタラクティブなモジュールを設計する

助けてもらえますか?

EDIT1:はちょうど種類が下の場合であるので、あなたはおそらくA.compare: A.t -> A.t -> boolを意味最初のコメント

+0

私はモジュールがインタラクティブであるかどうかは分かりませんが、おそらく相互に依存しているか関連しています。 –

答えて

1

これは古典的な設計上の問題です。 OOP言語では、クラスが型定義とその型に関連するメソッドの両方をカプセル化するため、これをうまく解決することは難しいです。したがって、a_of_bのように、2つの型を等しい程度とみなすとすぐに、そのための明確な場所はありません。

OCamlは、これらの異なるニーズに対して明確に異なる言語メカニズムを提供します。タイプ定義はキーワードtypeで導入され、関連するメソッドはmoduleでまとめられます。これにより、APIの設計に柔軟性がもたらされますが、問題は自動的に解決されません。

1つの可能性は、それぞれのタイプと比較機能の両方でモジュールAとBを定義することです。次に残る質問は、a_of_bb_of_aです。あなたは任意にモジュールAに好みを与え、関数A.to_bA.of_bを定義することができます。これは、標準ライブラリがto_listと​​をArrayに配置したときの結果です。これは対称性が欠けている。代わりにこれらの関数をBに入れない理由はありません。

代わりにof_関数vs to_関数を使用して標準化することができます。 to_を好んだとします。次に、関数A.to_bB.to_aを定義します。問題は今モジュールAとBが相互に依存していることです。モジュールAとBが同じファイルに定義されている場合にのみ可能です。

タイプA.tB.tの値を扱う関数がたくさんある場合は、モジュールABを定義し、そこにこれらの関数をすべて入れておく価値があります。 2つだけ必要な場合は、余分なモジュールがおそらく過剰です。

一方、AとBに関する関数の総数が少ない場合は、モジュールABのみを作成してtype a,type b、およびすべての関連メソッドを作成できます。しかし、これはOCamlコミュニティの独自のモジュール内でタイプtの命名規則に従わず、セットとマップのファンクタをこれらの型に適用するのは難しくなります。

+0

あなたのコメントをありがとう...私はまだAとBを含むモジュールABを定義する方法に興味があります。この場合、 'AB.A.to_b'と' AB.A.of_b'を作る方が良いでしょう。または 'AB.a_of_b'と' AB.b_of_a'? – SoftTimur

+0

'A.to_b'と' A.of_b'を定義すると、なぜモジュール 'AB'が必要なのかわかりません。それには 'A'と' B'モジュールだけが含まれていて、モジュール階層に余分なレイヤーを追加することの利点はありません。そして、 'A.to_b'と' A.of_b'と 'AB.a_of_b'と' AB.b_of_a'を定義すべきかどうかは、選択の問題です。私は考慮すべきいくつかの基準を提示した。 –

+0

サブモジュールAとBを含むモジュールABを持つ1つの理由は、単一のファイルab.mlとab.mli(a.ml、b.ml、a.mli、b.mliではなく) 。 –

1

に基づいていくつかのエラーを修正しました。

あなたはAの型及びB.

あなたは、サブモジュールとして& Bの両方を含む単一モジュールABを有することができるの型の両方を含む単一モジュールABを有することができます。

recursive modules &ファンクタを使用することもできます。

+0

ご意見ありがとうございました...実際、外からは、いつでも「A.compare」や「B.compare」を呼びたいと思います。したがって、それらを1つのモジュールABで定義すると、どうすれば外部から呼び出すことができますか? 'AB.A.compare'と' AB.B.compare'? – SoftTimur

+0

はい、 'AB.A.compare'と' AB.B.compare' –

+0

と 'AB.a_of_b'と' AB.b_of_a'ですか?これは、実装した実装についてです:最初または2番目? – SoftTimur

関連する問題