and*_*oke 7 monads state functional-programming 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))))
Run Code Online (Sandbox Code Playgroud)
该parameters函数生成一个state由其生成的惰性值序列,用于参数化某事物的重复变换(在本例中为"马赛克").
在我看来,它parameters显示了一个相当常见的模式,当你有一些state必须随身携带时(在这种情况下生成随机值).有这个名字吗?
是否有更好的方法来编写第一个函数?相关的问题通常可以通过reduce"携带"状态来解决,但在这里我没有什么可以减少的.同样,reductions似乎不合适.这对monad来说是个好例子吗?(从理论上看,我没有看到你如何定义一种方法将多个实例合并为一个,但也许这并没有改变实际的应用程序 - 它看起来像monad解决其他地方的问题,一些国家需要随身携带).
(ps我提到了随机数字,但我无法用在幕后使用可变状态的解决方案替换它 - 正如"正常"随机例程那样 - 出于与问题无关的原因).
您当然可以查看状态单子,看看它是否适合您。
使用 monad 的一般准则是:
我发现(对于 Clojure)非常有用的一些有关 monad 的资源是
Adam Smyczek:Monad 简介(视频) http://www.youtube.com/watch?v=ObR3qi4Guys
和 Jim Duey:Clojure 中的 Monad http://www.clojure.net/2012/02/02/Monads-in-Clojure/
| 归档时间: |
|
| 查看次数: |
664 次 |
| 最近记录: |