【发布时间】:2016-04-08 06:18:42
【问题描述】:
在 Clojure 中,我有一张这样的地图:
(def data {:a 1 :b 2 :c 3})
我想对所有元素求和并得到6 作为结果。我知道我可能应该使用reduce,但我不知道如何正确使用它。
【问题讨论】:
标签: clojure hashmap sum reduce
在 Clojure 中,我有一张这样的地图:
(def data {:a 1 :b 2 :c 3})
我想对所有元素求和并得到6 作为结果。我知道我可能应该使用reduce,但我不知道如何正确使用它。
【问题讨论】:
标签: clojure hashmap sum 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)。 + 将其视为单个参数并仅返回该值...哎呀。
(+ (vals data))
=> (1 2 3)
【讨论】: