在Clojure中,我有一张这样的地图:
(def data {:a 1 :b 2 :c 3})
我想总结所有元素并得到6
作为结果。我知道我应该使用reduce
,但我对如何正确使用它感到茫然。
答案 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)
答案 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