clojure - 为什么reduce函数会以相反的顺序产生结果?

标签 clojure

我正在尝试通过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/

相关文章:

clojure - 扩展 Clojure 核心协议(protocol)

java - 使用 clojure 中的 java api 读取 zip 文件

data-structures - 我应该使用 Clojure 的手指树做什么?

performance - Clojure 递归函数中的大型绑定(bind)会损害性能吗?

functional-programming - Clojure 中的命名参数函数

java - 来自 Java 的多个 Clojure 实例?

unit-testing - 如何在使用 throw-with-msg 的测试中捕获 IllegalArgumentException?

clojure - 有没有类似mapcdr的功能?

Clojure:文档

Clojure 宏为函数创建同义词