我有两个数据库,我试图使用一些 Clojure 胶水代码保持同步。
我想制作类似 a 的东西clojure.set/difference
,它对函数投影的值进行操作。
以下是一些示例数据:
(diff #{{:name "bob smith" :favourite-colour "blue"}
{:name "geraldine smith" :age 29}}
#{{:first-name "bob" :last-name "smith" :favourite-colour "blue"}}
:name
(fn [x] (str (:first-name x) " " (:last-name x))))
;; => {:name "geraldine smith" :age 29}
我得到的最好的是:
(defn diff
"Return members of l who do not exist in r, based on applying function
fl to left and fr to right"
[l r fl fr]
(let [l-project (into #{} (map fl l))
r-project (into #{} (map fr r))
d (set/difference l-project r-project)
i (group-by fl l)]
(map (comp first i) d)))
但是我觉得这有点笨拙,我无法想象它表现得很好。我正在丢弃我想保留的信息,然后再次查找。
我确实尝试过使用元数据,以在设置差异期间保留原始值,但我似乎无法将元数据放在原始类型上,所以这不起作用......
我不知道为什么,但我脑子里有个小声音告诉我,这种侧面的操作是 monad 的用途,我真的应该弄清楚什么是 monad 以及如何使用它。非常欢迎任何关于微小声音是否正确的指导!