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



在编写一些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,我使用了线程优先的宏->,它改变了执行顺序,这样您就可以从左到右而不是从内到外执行函数应用程序。

最新更新