我只是寫了這個代碼:如何更好地遍歷國家Clojure中(單子?)
(defn parameters [transform-factory state]
(lazy-seq (let [[r1 state] (uniform state)
[r2 state] (uniform state)
[t state] (transform-factory state)]
(cons [t [r1 r2]] (parameters transform-factory state)))))
(defn repeated-transform [mosaic n transform-factory state]
(reduce transform-square mosaic
(take n (parameters transform-factory state))))
的parameters
函數生成從state
產生的價值,這是用來進行參數重複改造的懶惰序列的東西(在這種情況下是「馬賽克」)。
在我看來,parameters
顯示了一個相當常見的模式,當你必須攜帶一些state
(在這種情況下產生隨機值)時,它會顯示出來。有沒有這個名字?
有沒有更好的方法來編寫第一個函數?相關的問題通常可以通過reduce
來解決,而這個「攜帶」狀態,但是在這裏我沒有什麼可以減少的。同樣,reductions
似乎不適合。這是一個monad的好例子嗎? (從理論上看,我沒有看到你如何定義一種將多個實例組合成一個的方法,但也許這並不會改變實際應用 - 它看起來像monads在其他地方解決的那種問題,某些州需要被帶走)。 (ps我提到了隨機數字,但我不能用一個在幕後使用可變狀態的解決方案替代這個 - 因爲「正常的」隨機例程會這樣做 - 這是與問題無關的原因)。
>(ps我提到了隨機數字,但我不能用一個在幕後使用可變狀態的解決方案替代這個 - 因爲「正常」的隨機例程 - 因爲與問題無關的原因)。 你可以使用a)帶有種子的僞隨機生成器,或者b)複製可變狀態(以便它不可變)。我採用這種方法來實施[純粹的mersenne twister] [1]。 [1]:http://hackage.haskell.org/package/mersenne-random-pure64-0.2.0.3 – 2012-04-26 20:36:58
我來這裏問完全相同的問題 – jes5199 2012-04-26 20:51:14
@DonStewart - 我不明白那是怎麼回事改變我所問的。實際上,我正在做的是複製這個狀態 - 這就是'狀態'的上面,以及我的問題的根源。 – 2012-04-26 22:05:29