Clojure グルー コードを少し使用して、同期を維持しようとしている 2 つのデータベースがあります。
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)))
しかし、これは少し扱いにくいと感じており、あまりうまく機能するとは想像できません。残しておきたい情報を捨てて、また調べています。
セットの違いの間に元の値を維持するために、メタデータを使用してみましたが、プリミティブ型にメタデータを配置できないようで、うまくいきませんでした...
理由はわかりませんが、頭の中で小さな声が聞こえてきて、モナドの目的はこの種の操作であり、モナドとは何か、どのように使用するかを実際に調べる必要があることを教えてくれます。それ。小さな声が正しいかどうかについてのガイダンスは大歓迎です!