关于函数式编程:Clojure左折

Clojure where is left fold

Clojure是否实现左折或右折?

我知道有一个新的带有这个功能的库缩减器,但它不应该存在于clojure.core中吗?


Clojure实现了称为reduce的左折。

为什么没有对折?

  • reduce和许多其他函数可用于序列,这些序列是
    可从左侧访问,但不能从右侧访问。

新的异径管和换能器旨在与可访问性不同的数据结构上的关联功能配合使用。


正如Thumbnail指出的那样,不能在序列的jvm上有效地实现reduce-right。 但事实证明,我们确实有一系列数据类型,它们可以从右侧进行有效的查找和截断。 向量可以实现reduce-right。

1
2
3
4
5
6
7
8
9
10
11
user>
(defn reduce-right
  [f init vec]
  (loop [acc init v vec]
    (if (empty? v)
      acc
      (recur (f acc (peek v)) (pop v)))))

#'user/reduce-right
user> (count (str (reduce-right *' 1 (into [] (range 1 100000))))) ; digit count
456569