これは古典的な設計上の問題です。 OOP言語では、クラスが型定義とその型に関連するメソッドの両方をカプセル化するため、これをうまく解決することは難しいです。したがって、a_of_bのように、2つの型を等しい程度とみなすとすぐに、そのための明確な場所はありません。
OCamlは、これらの異なるニーズに対して明確に異なる言語メカニズムを提供します。タイプ定義はキーワードtype
で導入され、関連するメソッドはmodule
でまとめられます。これにより、APIの設計に柔軟性がもたらされますが、問題は自動的に解決されません。
1つの可能性は、それぞれのタイプと比較機能の両方でモジュールAとBを定義することです。次に残る質問は、a_of_b
とb_of_a
です。あなたは任意にモジュールAに好みを与え、関数A.to_b
とA.of_b
を定義することができます。これは、標準ライブラリがto_list
とをArrayに配置したときの結果です。これは対称性が欠けている。代わりにこれらの関数をBに入れない理由はありません。
代わりにof_
関数vs to_
関数を使用して標準化することができます。 to_
を好んだとします。次に、関数A.to_b
とB.to_a
を定義します。問題は今モジュールAとBが相互に依存していることです。モジュールAとBが同じファイルに定義されている場合にのみ可能です。
タイプA.t
とB.t
の値を扱う関数がたくさんある場合は、モジュールABを定義し、そこにこれらの関数をすべて入れておく価値があります。 2つだけ必要な場合は、余分なモジュールがおそらく過剰です。
一方、AとBに関する関数の総数が少ない場合は、モジュールABのみを作成してtype a
,type b
、およびすべての関連メソッドを作成できます。しかし、これはOCamlコミュニティの独自のモジュール内でタイプt
の命名規則に従わず、セットとマップのファンクタをこれらの型に適用するのは難しくなります。
私はモジュールがインタラクティブであるかどうかは分かりませんが、おそらく相互に依存しているか関連しています。 –