私はいくつかのコードを残していますが、残念なことに、プログラム内の状態を追跡するための参照の幅広い使用があります。オイラー法を経て、多くの値を更新し一つのモジュールにおけるそれらの特に悪質な利用があります:バインディングを繰り返す方法はありますか?
eulerUpdate states timestep = do
_val1 <- readReference (val1 states)
_dval1 <- readReference (dval1 states)
_val2 <- readReference (val2 states)
_dval2 <- readReference (dval2 states)
-- ...
_valn <- readReference (valn states)
_dvaln <- readReference (dvaln states)
let euler val deriv = val + deriv * timestep
writeReference (val1 states) euler _val1 _dval1
-- ...
writeReference (valn states) euler _valn _dvaln
私はHaskellのは比較的新しいんだけど、私の理解では、この恐ろしい、恐ろしい、ない良い、非常に悪いことということです。その周りのすべてのものをリファクタリングするのではなく、読みやすさのためにLOCを少なくするための方法があると思っていました。 readReference (x states)
を多数の識別子に「マップ」するためにここで実行できることはありますか?私はKliesliの矢をもっと見てきましたが、私はここで私を助けてくれることはあまりありません。
これらはおそらくすべての異なるタイプがありますか?そうでなければ、 'mapM'や' forM'を使ってこれをリスト表現に変換できるはずですが、それほど素晴らしいものは得られません - しかし、あなたがよく見れば、2つの値だけを一緒に使用するようです本当に長いリストなぜあなたはこれを利用していないのですか? – Carsten
私はいくつかの派手なリファクタリング技術の必要はないと思う、単純な機能はおそらくトリックを行うでしょう。例えば'f ::(状態 - >参照a) - >(状態 - >参照b) - >(a - > b - > IO a) - > IO a = \ val dval f - > join(f <$> readReference (valval states)<*> readReference(dval states))>> = writeReference(val states) ' - 明らかに正確な型が分からない(少なくとも)すべての参照が同じ型を持つ場合は、 'map'のようなものを使用してください。 – user2407038