承载 state/IO 通过 Clojure 中的函数链,以便稍后在链中使用

Carrying state/IO through a chain of functions in Clojure to be used later in the chain

我有一个功能性的问题。

如果我有一个函数链,我在其中以前一个输出为下一个输入的方式组合函数。

在这条链的某个地方,我需要一些东西来做 IO,比如数据库的客户端等。

什么样的 Clojure 方法可以实现它?

=========

为了解释得更清楚,

(let [map {:aThing "I'm a"}]
(->> (a->b map)
     (b->c)
     (c->d)
     (d->e)))
  1. (a->b):aThing 转换为 :bThing
  2. (b->c):bThing 转换为 :cThing 但它需要一些可以 AES 解密的东西才能做到这一点.
  3. (c->d):cThing 转换为 :dThing 但它是通过从数据库中获取内容来实现的,因此需要数据库 username/pasword、端点、连接等
  4. (d->e):dThing 转换为 :eThing 和 returns。
  5. 链条完成。

在 Clojure 中,允许此链工作的正确方法是什么?

如果一棵树倒在树林里,它会发出声音吗? 如果纯函数改变一些本地数据以产生不可变的 return 值,可以吗? -- 里奇·希基

我说Davyzhu是对的

我的处理方式是这样的:

(def conn-opts {:user :name
                :password :pass
                ;any other params})

(defn c->d [conn-opts map]
 (let [db (connect conn-opts)]
      ;return the result of applying the transformation 
      ;on the map and the db.
     (fn-do map db))

(defn job [map]
 (->> map
      (a->b)
      (b->c)
      (c->d conn-opts)
      (d->e)))