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

Zar*_*oth 2 reduce sum clojure hashmap

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

(def data {:a 1 :b 2 :c 3})
Run Code Online (Sandbox Code Playgroud)

我想总结所有元素并得到6结果.我知道我应该使用reduce,但我不知道如何正确地做到这一点.

mun*_*unk 13

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

reduce

(reduce + (vals data))
Run Code Online (Sandbox Code Playgroud)

或者 apply

(apply + (vals data))
Run Code Online (Sandbox Code Playgroud)

它们对于关联函数是等价的.

我建议这apply更惯用,因为+已经通过reduce实现了.

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

结果(vals data)是列表(1 2 3).+将此视为单个参数,只返回该值... oops.

(+ (vals data))
=> (1 2 3)
Run Code Online (Sandbox Code Playgroud)

apply 基本上解压缩列表的工作原理.


jma*_*svt 5

您是正确的,应该在这里减少。 vals会为您提供您要累加的值,然后将reduce它们加到加法函数上。

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