什么时候在Clojure中使用reduce-kv而不是减少?

时间:2018-02-11 14:32:39

标签: clojure

reduce reduce-kv 有什么区别?

何时使用 reduce-kv 而不是 reduce ,反之亦然?

1 个答案:

答案 0 :(得分:11)

每当你减少关联集合时,你应该看到使用reduce-kv时性能的提高,因为它没有为键/值对分配向量/元组。 reduce将处理集合(以及作为键/值元组集合处理的映射),但reduce-kv仅适用于地图和矢量等关联结构。

来自IKVReduce协议docstring:

  

“可以减少自身的具体关联类型的协议      通过键和val的函数比地图上的第一次/下一次递归更快      条目。由clojure.core / reduce-kv调用,并且具有相同的功能      语义(只是不同的arg顺序)。“

使用它们之间的区别在于您不需要在缩减函数中对结构/值进行解构:

(reduce (fn [m [k v]]
          (assoc m k (str v)))
        {}
        {:foo 1})

(reduce-kv (fn [m k v]
             (assoc m k (str v)))
           {}
           {:foo 1})