如何可以通过reduce来定义map,filter和reverse等操作? [英] How can operations like map, filter and reverse can be defined in terms of a reduce?
问题描述
在此博客条目中,JavaScript中的CSP和换能器 a>,作者指出:
首先,我们要实现许多数组(或其他集合)操作,如
)map
,过滤器
和reverse
可以定义<$ c $我的问题是:如何操作,如地图,过滤器和反向操作(如:
解决方案这是真的,如果你能在Clojure中提供例子我们不关心懒惰。在Clojure中,
map
和过滤器
是惰性的,但reduce是急切的。不仅reverse
不是延迟,而是标准定义使用reduce。模糊惰性,我们可以为其他人获得等效的结果:user> (defn eager-map [f coll]
(reduce(fn [acc v](conj(fv)))
[]
coll))
# 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(fv)(conj acc v)acc))
[]
coll))
#'user / eager-filter
user> (eager-filter even?(range 10))
[0 2 4 6 8]
user> (def n eager-reverse [coll]
(reduce conj()coll))
#'user / eager-reverse
user> (eager-reverse(range 10))
(9 8 7 6 5 4 3 2 1 0)
In this blog entry, "CSP and transducers in JavaScript", the author states:
First, we have to realise that many array (or other collection) operations like
map
,filter
andreverse
can be defined in terms of areduce
.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?
解决方案This is true, if we don't care about laziness. In Clojure,
map
andfilter
are lazy, but reduce is eager. Not only isreverse
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屋!