合并地图列表并将值组合到Clojure中的集合

Ale*_*ler 12 functional-programming clojure

作为FOO,我可以将什么功能放在最后?我玩哈希集(只对前两个值正确),conj和concat,但我知道我没有正确处理单元素与设置条件中的任何一个.

(defn mergeMatches [propertyMapList]
    "Take a list of maps and merges them combining values into a set"
    (reduce #(merge-with FOO %1 %2) {} propertyMapList))

(def in 
    (list
        {:a 1}
        {:a 2}
        {:a 3}
        {:b 4}
        {:b 5}
        {:b 6} ))

(def out
    { :a #{ 1 2 3}
      :b #{ 4 5 6} })

; this should return true
(= (mergeMatches in) out)
Run Code Online (Sandbox Code Playgroud)

处理这个问题最常用的方法是什么?

cem*_*ick 12

这样做:

(let [set #(if (set? %) % #{%})]
  #(clojure.set/union (set %) (set %2)))
Run Code Online (Sandbox Code Playgroud)

为示例(Alex)更直接地重写:

(defn to-set [s]
    (if (set? s) s #{s}))
(defn set-union [s1 s2] 
    (clojure.set/union (to-set s1) (to-set s2)))
(defn mergeMatches [propertyMapList]
    (reduce #(merge-with set-union %1 %2) {} propertyMapList))
Run Code Online (Sandbox Code Playgroud)


Ale*_*ler 5

我没有写这一点,但它有助于通过@amitrathore的Twitter:

(defn kv [bag [k v]] 
  (update-in bag [k] conj v))
(defn mergeMatches [propertyMapList]
  (reduce #(reduce kv %1 %2) {} propertyMapList))
Run Code Online (Sandbox Code Playgroud)