2024 Clojure 调查问卷中分享你的想法!

欢迎!请访问关于页面以了解更多关于该操作的信息。

+11
Transducers
重新标签

我经常发现自己需要编写一个和 `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))))

1 个回答

+1
...