質問

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

すべてを命令的なスタイルで行うのではなく、私がやりたいと思っていたのは、以下を行うより機能的なスタイルのClojureソリューションを作成することでした。

  • ベクトル関数をaに変えることを許可します プラグ可能なモジュール, 、EG(def module-a(Make-Module SomeFunction))
  • これらのモジュールを許可します パイプラインで構成されています, 、例えば(def combined-module(combine-in-series module-a module-b))は、モジュールAの出力をモジュール-Bの入力に送ります
  • 許可する 補助関数 特定のモジュール内に保存されている状態にアクセスするには、例えば(Get-Moverver-Averaver-Average-Module)。
  • ボイラープレートコードを非表示にします 舞台裏では、たとえば、ベクター計算に十分に大きな一時アレイを割り当てます。

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

もしそうなら、実装は役立つかもしれないヒントやライブラリですか?

役に立ちましたか?

解決

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

それぞれのユースケースに対処するには:

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

他のヒント

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top