我正在尝试通过reduce函数实现map函数。我正在遵循 Rich Hickey 在他关于传感器的演示文稿中编写的示例代码。
(defn mapr [f coll] (reduce (fn [xs x] (cons (f x) xs)) () coll))
(println (mapr inc '(1 2 3 4 5))) ; (6 5 4 3 2)
但是我无法理解为什么列表会以相反的顺序映射?
最佳答案
这是因为 cons
将该项放在 seq 的前面。请参阅https://clojuredocs.org/clojure.core/cons :
(cons x seq)
Returns a new seq where x is the first element and seq is the rest.
因此,在您的情况下,1
将递增到 2
,然后放入空列表的开头,给出 '(2)
。缩减函数要处理的下一个值是2
。它将递增到 3
,然后放置在 '(2)
的开头,给出 '(3 2)
,依此类推。 .
请注意,我的语言有点宽松:每次调用reduce函数时都会返回一个新的seq,即cons
每次调用时都会创建一个新列表。
关于clojure - 为什么reduce函数会以相反的顺序产生结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46272015/