2

多くのベクトルデータを処理する必要があるClojureでいくつかのシミュレーションソフトウェアを開発しています(基本的には、Java floatの配列へのオフセットとして発生し、通常は10〜10000の範囲の長さです)。これらの多数のベクトルは、ベクトルの正規化、ベクトルの 2 つのストリームの連結、移動平均の計算など、さまざまな処理ステップを経る必要があります。

すべてを命令型スタイルで行うのではなく、次のことを行う、より機能的なスタイルの Clojure ソリューションを作成することを望んでいました。

  • 任意のベクトル関数をプラグ可能なモジュールに変換できるようにします。例: (def module-a (make-module some-function))
  • これらのモジュールをパイプラインで構成できるようにします。たとえば、(def combined-module (combine-in-series module-a module-b)) は、module-a の出力を module-b の入力にフィードします。
  • 補助関数が特定のモジュール内に格納された状態にアクセスできるようにする (get-moving-average some-moving-average-module など)。これは、some-moving-average-module が結合されたパイプラインの奥深くに埋め込まれている場合でも機能する必要があります。
  • ベクトル計算用に十分な大きさの一時配列を割り当てるなど、ボイラープレート コードを舞台裏に隠します。

これは賢明なアプローチのように聞こえますか?

もしそうなら、役立つ実装のヒントやライブラリはありますか?

4

2 に答える 2

3

関数型言語では、すべてがデータフローです。関数をモジュールの概念として使用できます。

各ユースケースに対処するには:

  • pluggagbleモジュールは、データ ベクトルの状態である単一の引数を取る Clojure 関数です。たとえば(def module-a some-function) 、モジュールによる簡単な拡張を可能にするために、Clojure マップを状態として使用することをお勧めします。ここで、1 つのフィールドは float の配列です。
  • モジュールの合成は関数合成です。例えば(def combined-module (compose module-a module-b)
  • 補助関数は、データから状態を抽出するアクセサー関数です。:moving-averageたとえば、データがフィールドを持つ Clojure マップの場合、キーワード:moving-averageはアクセサ関数です。状態はモジュールに保存されません。
  • ボイラープレート コードは、関数の実装に隠されています。これは、別のファイルや名前空間など、どこでも宣言できます。
于 2010-10-19T21:24:14.213 に答える
2

チェックアウト コンジット。 http://intensivesystems.net/tutorials/conduit-motive.html

于 2010-10-19T16:53:06.010 に答える