在Clojure中解决状态monad在Haskell中解决的问题的惯用方法是什么?

时间:2015-11-14 09:26:47

标签: clojure monads

在编写一些Clojure代码时遇到了以下问题。

我有三个函数F1 F2 F3现在我想按顺序执行这三个函数并将输出从F1传递到F2,然后使用连接结果F1和F2作为F3的输入。

我对monad的知识有限,但这让我感到震惊,因为状态monad的设计类型是什么?

Clojure处理这种情况的惯用方法是什么?

更新:这些功能不是返回联合结果。我需要在每次函数调用后结合结果。

2 个答案:

答案 0 :(得分:3)

(-> :value
    f1
    f2
    f3)

这是使用thread macro,另请参阅->>

当我在clojure中寻找信息和学习单子时,Jim Duey's State monadKonrad Hinsen's Monad tutorials帮助了很多。

但是,如果您正在寻找惯用语,上面的线程宏是要走的路,f1的结果是线程到f2,它的结果是f3。您是否受限于功能设计?

最后,这里有this SO question a link to state examples

答案 1 :(得分:0)

你不需要州monad。

(def pipe [n]
    (letfn [(F1 [x] (inc x))
            (F2 [y] (dec y))
            (F3 [z w] (/ z w))]
     (let [r1 (F1 n)
           r2 (-> n F1 F2)]
      (F3 r1 r2)))

我不确定这究竟是你的目标。状态monad解决的大多数问题在Clojure中不存在,因为我们已经让绑定。对于r2我使用线程第一个宏->它改变了执行顺序,这样你就可以从左到右而不是从里到外执行函数应用。