我刚刚写了这段代码:
(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
解决,它“携带”了 State ,但在这里我没有什么可以减少的。同样,reductions
似乎不适合。这是一个单子(monad)的好例子吗? (从理论上的观点来看,我看不到您如何定义将多个实例组合为一个的方法,但这可能不会改变实际应用-它确实看起来像是单子(monad)在其他地方解决的问题,其中某些状态需要随身携带)。(ps我提到了随机数,但由于与问题无关的原因,我不能用在幕后使用可变状态的解决方案来替换它 - 正如“正常”随机例程所做的那样)。
最佳答案
您当然可以查看 state monad,看看它是否适合您。
使用 monad 的一般准则是:
State )
我发现(对于 Clojure)非常有用的一些关于 monad 的资源是
亚当·斯迈切克:
单子(monad)简介(视频)
http://www.youtube.com/watch?v=ObR3qi4Guys
和
吉姆·杜伊:
Clojure 中的单子(monad)
http://www.clojure.net/2012/02/02/Monads-in-Clojure/
关于clojure - 如何更好地迭代 Clojure 中的状态(monad?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10337932/