在编写一些Clojure代码时遇到了以下问题。
我有三个函数F1 F2 F3
现在我想按顺序执行这三个函数并将输出从F1传递到F2,然后使用连接结果F1和F2作为F3的输入。
我对monad的知识有限,但这让我感到震惊,因为状态monad的设计类型是什么?
Clojure处理这种情况的惯用方法是什么?
更新:这些功能不是返回联合结果。我需要在每次函数调用后结合结果。
答案 0 :(得分:3)
(-> :value
f1
f2
f3)
这是使用thread macro,另请参阅->>
当我在clojure中寻找信息和学习单子时,Jim Duey's State monad和Konrad Hinsen's Monad tutorials帮助了很多。
但是,如果您正在寻找惯用语,上面的线程宏是要走的路,f1的结果是线程到f2,它的结果是f3。您是否受限于功能设计?
答案 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我使用线程第一个宏->
它改变了执行顺序,这样你就可以从左到右而不是从里到外执行函数应用。