在编写一些Clojure代码时,我遇到了以下问题。
我有三个函数F1 F2 F3
现在我想按顺序执行这三个函数,并将输出从F1传递到F2,然后使用组合结果F1和F2作为F3的输入。
我对monad的了解有限,但这让我印象深刻,因为状态monad到底是为什么类型的问题设计的?
Clojure中处理这种情况的惯用方法是什么?
更新:函数不会返回联合结果。我需要在每次函数调用后将结果结合起来。
(-> :value
f1
f2
f3)
这是使用线程宏,另请参阅->>
当我自己在clojure中寻找信息和学习monad时,Jim Duey的State monad和Konrad Hinsen的monad教程都帮了我很多忙。
然而,如果您正在寻找惯用方法,那么上面的线程宏是可行的,f1中的结果是线程到f2中的,它的结果是f3中的。你在功能设计方面受到限制吗?
最后,这里有一个SO问题,链接到状态示例
您不需要状态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中都不存在,因为我们有let绑定。对于r2,我使用了线程优先的宏->
,它改变了执行顺序,这样您就可以从左到右而不是从内到外执行函数应用程序。