如何根据reduce定义map、filter和reverse等操作? [英] How can operations like map, filter and reverse can be defined in terms of a reduce?
问题描述
在此博客条目中,JavaScript 中的 CSP 和转换器",作者声明:
In this blog entry, "CSP and transducers in JavaScript", the author states:
首先,我们必须意识到许多数组(或其他集合)操作,如map
、filter
和reverse
可以用术语定义reduce
.
First, we have to realise that many array (or other collection) operations like
map
,filter
andreverse
can be defined in terms of areduce
.
我的问题是:如何根据reduce定义map、filter和reverse等操作?您能否提供Clojure中的示例?
My question is: How can operations like map, filter and reverse can be defined in terms of a reduce? Could you provide examples in Clojure?
推荐答案
这是真的,如果我们不关心懒惰的话.在 Clojure 中,map
和 filter
是惰性的,而 reduce 是渴望的.reverse
不仅不懒惰,而且标准定义使用reduce.以懒惰为模,我们可以得到其他人的等价结果:
This is true, if we don't care about laziness. In Clojure, map
and filter
are lazy, but reduce is eager. Not only is reverse
not lazy, but the standard definition uses reduce. Modulo the laziness, we can get equivalent results for the others:
user> (defn eager-map [f coll]
(reduce (fn [acc v] (conj acc (f v)))
[]
coll))
#'user/eager-map
user> (eager-map inc (range 10))
[1 2 3 4 5 6 7 8 9 10]
user> (defn eager-filter [f coll]
(reduce (fn [acc v] (if (f v) (conj acc v) acc))
[]
coll))
#'user/eager-filter
user> (eager-filter even? (range 10))
[0 2 4 6 8]
user> (defn eager-reverse [coll]
(reduce conj () coll))
#'user/eager-reverse
user> (eager-reverse (range 10))
(9 8 7 6 5 4 3 2 1 0)
这篇关于如何根据reduce定义map、filter和reverse等操作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!