我经常发现自己在编写一个减少函数,它执行与 group-by
相同的功能。如果 group-by
返回一个减少函数将会很方便(而不需要导入 Christophe Grand 的 xforms 库)。所以我不需要写:
(->> (range 10)
(transduce (map inc) (completing (fn [r x] (update r (even? x) (fnil conj []) x))) {}))
我可以写:
(->> (range 10)
(transduce (map inc) (group-by even?)))
可能是这样的?
(defn group-by
([f]
(fn
([] (transient {}))
([r] (persistent! r))
([r x]
(let [k (f x)]
(assoc! r k (conj (get r k []) x))))))
([f coll]
(persistent!
(reduce
(fn [ret x]
(let [k (f x)]
(assoc! ret k (conj (get ret k []) x))))
(transient {}) coll))))