何时在Clojure中使用reduce-kv而不是降低?

Ert*_*tin 5 clojure

reducereduce-kv有什么区别?

何时使用reduce-kv over reduce,反之亦然?

Tay*_*ood 11

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

IKVReduce协议docstring:

"具体关联类型的协议,可以通过key和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})
Run Code Online (Sandbox Code Playgroud)