我正在尝试“净化”我的一些 Clojure 函数。我想达到一个点,即我所有的副作用代码都在一个函数中显式声明。在开始时获取一些数据并在结束时将其写入数据库很容易,并且在两者之间只有一个纯函数转换。但是,通常的情况是转换函数需要在逻辑中间某处读取另一个 DB:
(defn transform-users
[users]
(let [ids (map :id users)
profiles (db/read :profiles ids)]
(profiles->something profiles)))
(->> (db/read :users)
(transform-users)
(db/write :something)
显然这是一个非常简单的例子,但重点是,我如何从那里获得副作用db/read
功能,我怎样才能使transform-users
纯(并且作为一个好处,易于测试)?