在Clojure中,我有一张这样的地图:
(def data {:a 1 :b 2 :c 3})
我想总结所有元素并得到6
结果.我知道我应该使用reduce
,但我不知道如何正确地做到这一点.
有两种简单的方法可以做到这一点.
同 reduce
(reduce + (vals data))
或者 apply
(apply + (vals data))
它们对于关联函数是等价的.
我建议这apply
更惯用,因为+已经通过reduce实现了.
也就是说,如果我们计算(+ 1 2 3)
,结果就是6.所以很自然地会问为什么(+ (vals data))
还不够.
结果(vals data)
是列表(1 2 3)
.+
将此视为单个参数,只返回该值... oops.
(+ (vals data)) => (1 2 3)
apply
基本上解压缩列表的工作原理.
您是正确的,应该在这里减少。 vals
会为您提供您要累加的值,然后将reduce
它们加到加法函数上。
user=> (def data {:a 1 :b 2 :c 3}) #'user/data user=> (vals data) (3 2 1) user=> (reduce + (vals data)) 6