如何对哈希图中的所有值求和?
How to sum all values in a hashmap?
在 Clojure 中,我有一个这样的映射:
(def data {:a 1 :b 2 :c 3})
我想对所有元素求和,得到 6
结果。我知道我应该使用 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)
。 +
将此视为单个参数,只是 returns 该值...哎呀。
(+ (vals data))
=> (1 2 3)
在 Clojure 中,我有一个这样的映射:
(def data {:a 1 :b 2 :c 3})
我想对所有元素求和,得到 6
结果。我知道我应该使用 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)
。 +
将此视为单个参数,只是 returns 该值...哎呀。
(+ (vals data))
=> (1 2 3)