如何对hashmap中的所有值求和?

时间:2016-01-04 15:29:38

标签: clojure hashmap sum reduce

在Clojure中,我有一张这样的地图:

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

我想总结所有元素并得到6作为结果。我知道我应该使用reduce,但我对如何正确使用它感到茫然。

2 个答案:

答案 0 :(得分:13)

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

使用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)+将此视为单个参数,只返回该值... oops。

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

apply works by essentially unpacking the list

答案 1 :(得分:4)

你是对的,你应该在这里减少。 vals会为您提供您想要添加的值,然后只需reduce通过添加功能。

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