如何在Clojure中更好地迭代状态(monad?)

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我提到了随机数字,但我无法用在幕后使用可变状态的解决方案替换它 - 正如"正常"随机例程那样 - 出于与问题无关的原因).

car*_*ier 4

您当然可以查看状态单子,看看它是否适合您。

使用 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/