2024 Clojure状态调查!分享您的想法。

欢迎!请参阅关于页面以了解更多关于它是如何工作的信息。

+8
集合

如果group-by允许用户控制聚合集合类型并在聚合之前操作值会很好。这通常是在根据一个键将映射集合分组以及根据另一个键进行聚合(甚至可能是数值聚合)的情况下。

group-by可以被泛化如下

(defn group-by
  "Returns a map of the elements of coll keyed by the result of
  f on each element. The value at each key will be a vector of the
  corresponding elements, in the order they appeared in coll."
  {:added "1.2"
   :static true}
  ([kf coll]
   (group-by kf [] coll))
  ([kf init coll]
   (group-by kf identity init coll))
  ([kf vf init coll]
   (group-by kf vf conj init coll))
  ([kf vf rf init coll]
   (persistent!
    (reduce
     (fn [ret x]
       (let [k (kf x)]
         (assoc! ret k (rf (get ret k init) (vf x)))))
     (transient {}) coll))))

1 个答案

+1

我真的很喜欢如何使用xforms分解group-by

(defn my-group-by [kfn coll]
  (x/into {}
   (x/by-key
    kfn
    (x/into []))
   coll))
  1. 分组:使用x/by-keykfn负责分离值流
  2. 内部聚合:它获取一个transducer以聚合组内的值,(x/into [])与核心实现匹配
  3. 外部聚合:它返回一个transducer,从而调用者可以决定如何进行外部聚合,(x/into {} ,,, coll)与核心实现匹配

我希望看到对核心(包括group-by)的改进,支持可transducer的过程。

这并没有错,但如果像泛化现有实现一样,只是将每个值都作为一个参数,那么xforms就需要相对较大的改变。
...