9

私はOCamlでいくつかのアルゴリズムを開発しており、計算の一部が特定の計算機に委ねられるように、いくつかの部分を「プラグイン可能」にする必要があります。

例を示すために、次のような署名があるとします。

module type Algorithm = sig
    val feed : float -> unit
    val nth : int -> (float -> float)
end

Alg1そして、とになる2つの異なる実装Alg2。このAlgorithmモジュールは、これら2つの実装のようなさまざまな実装のインターフェースを表す必要があります。

今度は別のコンポーネントが必要です。それを、それらのインターフェースを使用する、またはインターフェースを介してExecutor使用するモジュールと呼びましょう。Alg1Alg2

ファンクターについて読むと、必要なアルゴリズムの特定の実装でを取得しAlgorithmて生成するファンクターが必要なようです。ConcreteExecutorつまり、これExecutorは、そのコンポーネントの1つでパラメーター化された一種のモジュールです。

私は正しいですか?必要なものを手に入れる最良の方法ですか?私はJava/C ++のバックグラウンドを持っているので、このような考えを疑問に思っています。そのため、インターフェイスと抽象クラスを使用することに慣れており、このファンクター/モジュールの抽象化の問題に正しい方法で取り組む必要があります。

私が欲しいものを取得するための正しい構文はどれですか?

前もって感謝します

4

1 に答える 1

4

うん、ファンクターはあなたが望むもののように聞こえます。実際、ソースコードが利用可能であるため、標準ライブラリがファンクターをどのように使用するかを見ることができます。私のマシンでは、それは/usr/lib/ocaml/3.10.2/にあります。例として、set.mliには次のものが含まれています。

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

module type S
  sig
    ...
  end

module Make (Ord : OrderedType) : S with type elt = Ord.t

OCamlでセットを使いたいときは、次のようにします。

module SSet = Set.Make(String);;

したがって、コードでは、AlgorithmがOrderedTypeを置き換え、Alg1 / Alg2がStringを置き換え、ExecutorがMakeを置き換え、ConcreteExecutorがExecutor(Alg1 / Alg2)の結果になります。string.mli/mlにはOrderedTypeの記述が含まれていないことにも気付くでしょう。文字列は、関数compareによって使用されるタイプtを持っているため、OrderedTypeです。StringがOrderedTypeであると明示的に言う必要はありません。

于 2010-08-05T15:33:28.980 に答える