私はほぼ純粋な数学的計算のプログラムを持っています。問題は、それらの計算の一部がモンテカルロ生成値で動作することです。私は2つの設計オプションを持っているようランダム値を計算するhaskellプログラムでモナドを構造化する方法は?
それはそうです:
どちらのすべての私の計算機能は、事前に生成されたモンテカルロチェーンが含まれている追加のパラメータを取ります。これにより私はどこでも純粋な関数を保つことができますが、他の関数を呼び出す関数があるので、コードベースに多くのラインノイズが追加されます。
他のオプションは、すべての計算機能をモナドにすることです。関数の中には、ランダム値を必要とする関数を呼び出す関数を呼び出しているランダム値を使用していないものもあるので、これは残念です。
ここに好適な設計に関するいかなるガイダンスはありますか?具体的には、モンテカルロ値が関係するコード内のモナド/非モナド関数の分離?
次の関数に転送する必要がある各ステップで新しい値を作成していますか、複数の関数で1つの値しか使用していませんか?前者の場合は国家モナドが良い選択ですが、後者ならリーダーモナドがおそらく最良の選択肢です。あなたは実際に 'MonadReader'を使って関数を書くことができますし、後でそれらを純関数として使うことができます。 – bheklilr
これは、あらかじめ計算された文脈を回るのと似ているでしょうか?純粋に私がリストの周りを回っていた場合を除いて、リストはリーダーか州に置き換えられますか? – daj
関数のいくつかがランダム値を使用していない場合、すべての関数にparamを追加するか、すべてをモナドアクションに変換することは、唯一の選択肢にはなりません。ランダム性/非決定性を必要としないfnを変更しないでください。あなたはあなたのモナド/ファンクターの上でそれらを常にfmapしたり、モナドの 'let'式でそれらを使うことができます。ランダム性を必要とするアクションの場合、 'MonadReader StdGen m'制約を持つモナドにそれらを保存させるか、それらのfnを純粋なままにして、古い世代のものを得るために' StdGen'パラメータを 'split'与えます。 – liminalisht