【发布时间】:2017-06-20 20:50:26
【问题描述】:
我有列表集合,我想为集合中的每个列表应用“减少 +”。我想我应该结合“应用”、“地图”和“减少+”,但我不明白怎么做。
例子:
[[1 2 3] [4 5 3] [2 5 1]] => [6 12 8]
【问题讨论】:
我有列表集合,我想为集合中的每个列表应用“减少 +”。我想我应该结合“应用”、“地图”和“减少+”,但我不明白怎么做。
例子:
[[1 2 3] [4 5 3] [2 5 1]] => [6 12 8]
【问题讨论】:
不需要apply。 map 和 reduce 可以正常工作:
(map (partial reduce +) [[1 2 3] [4 5 3] [2 5 1]])
map 将调用列表中每个成员的函数,partial 只是创建一个需要一个参数的“curried”版本的 reduce。也可以写成#(reduce + %) 或(fn [lst] (reduce + lst))
更新
您实际上也可以在此处使用 apply 代替 reduce(但不能同时使用两者):
(map (partial apply +) [[1 2 3] [4 5 3] [2 5 1]])
进一步更新
如果您有任何性能问题,请参阅此答案中的 cmets,了解 @AlexMiller 提供的一些重要提示
【讨论】:
reduce 是这两者之间的首选,并且可能更快,尤其是在子向量很大的情况下
apply + 只是委托给reduce +,因此速度差异可以忽略不计,尤其是对于大型向量。正如stackoverflow.com/a/3153643/625403 所说,apply 始终可以选择委托给reduce,但可以利用一些无法减少的特殊优化;反之则不成立。
apply + 与 reduce + 进行比较,而不是一般情况下(尽管在大多数情况下,我认为 reduce 比 apply 等价物更清晰、更快速)。正如您所提到的, apply 在这里只是开销,时间:gist.github.com/puredanger/88d0491cbb4dbf8fe98b3747963d0068
(map (partial reduce +) ...) = 17 ns,但 (map #(reduce + %) ...) = 13 ns。