承载 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)))
(a->b)
将 :aThing
转换为 :bThing
(b->c)
将 :bThing
转换为 :cThing
但它需要一些可以 AES 解密的东西才能做到这一点.
(c->d)
将 :cThing
转换为 :dThing
但它是通过从数据库中获取内容来实现的,因此需要数据库 username/pasword、端点、连接等
(d->e)
将 :dThing
转换为 :eThing
和 returns。
- 链条完成。
在 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)))
我有一个功能性的问题。
如果我有一个函数链,我在其中以前一个输出为下一个输入的方式组合函数。
在这条链的某个地方,我需要一些东西来做 IO,比如数据库的客户端等。
什么样的 Clojure 方法可以实现它?
=========
为了解释得更清楚,
(let [map {:aThing "I'm a"}]
(->> (a->b map)
(b->c)
(c->d)
(d->e)))
(a->b)
将:aThing
转换为:bThing
(b->c)
将:bThing
转换为:cThing
但它需要一些可以 AES 解密的东西才能做到这一点.(c->d)
将:cThing
转换为:dThing
但它是通过从数据库中获取内容来实现的,因此需要数据库 username/pasword、端点、连接等(d->e)
将:dThing
转换为:eThing
和 returns。- 链条完成。
在 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)))