clojure - 如何更好地迭代 Clojure 中的状态(monad?)

标签 clojure functional-programming state monads

我刚刚写了这段代码:

(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/

    相关文章:

    haskell - 在列表中的每 n 个元素之后插入特定元素 y

    javascript - Extjs 保存动态选项卡并将其渲染回页面加载,这可能吗?

    java - 在java中覆盖 "equals"的clojure等价物是什么?

    clojure - 如何向该函数添加参数?

    macros - 将 Clojure 宏用于 DSL

    javascript - 在 React 中更新状态时出现问题

    node.js - node.js 中的多人游戏架构 - 状态管理和与 Redux 的同步

    recursion - 递归地跟踪 HashMap clojure 中的值

    for-loop - Elm - 树 - 将分支添加到另一棵树 - 递归 for 循环

    javascript - x = (a) => b(a) 与 `x = b` 不同