如何对哈希图中的所有值求和?

How to sum all values in a hashmap?

在 Clojure 中,我有一个这样的映射:

(def data {:a 1 :b 2 :c 3})

我想对所有元素求和,得到 6 结果。我知道我应该使用 reduce,但我不知道如何正确使用它。

你是对的,你应该减少这里。 vals 会得到你想要相加的值,然后 reduce 它们通过加法函数。

user=> (def data {:a 1 :b 2 :c 3})
#'user/data
user=> (vals data)
(3 2 1)
user=> (reduce + (vals data)) 
6

有两种简单的方法可以做到这一点。

reduce

(reduce + (vals data))

apply

(apply + (vals data))

They are equivalent for associative functions.

我建议 apply 更符合惯用语,因为 + is already implemented via reduce

也就是说,如果我们计算(+ 1 2 3),结果是6。所以很自然地会问为什么(+ (vals data))是不够的。

(vals data) 的结果是列表 (1 2 3)+ 将此视为单个参数,只是 returns 该值...哎呀。

(+ (vals data))
=> (1 2 3)

apply works by essentially unpacking the list.