为什么折叠和减少被认为是基本的 - 当然一切都是根据缺点和汽车来定义的?

haw*_*eye 3 lisp reduce clojure fold higher-order-functions

我们可以看到,我们可以使用reduce/ foldl1作为我们可以定义其他更高阶函数的函数,例如map,filter和reverse.

(defn mapl [f coll]
  (reduce (fn [r x] (conj r (f x)))
          [] coll))

(defn filterl [pred coll]
  (reduce (fn [r x] (if (pred x) (conj r x) r))
          [] coll))

(defn mapcatl [f coll]
  (reduce (fn [r x] (reduce conj r (f x)))
          [] coll))
Run Code Online (Sandbox Code Playgroud)

我们似乎也可以这样做foldr.下面是mapfilter来讲foldr,从丰富的希基的传感器说话 17:25.

(defn mapr [f coll]
  (foldr (fn [x r] (cons (f x) r))
         () coll))

(defn filterr [pred coll]
  (foldr (fn [x r] (if (pred x) (cons x r) r))
         () coll))
Run Code Online (Sandbox Code Playgroud)

现在,我们可以定义map,foldl(reduce),并foldr在以下方面first,restcons(car,cdrcons):

(defn foldr [f z xs]
   (if (null? xs)
       z
       (f (first xs) (foldr f z (rest xs)))))

(defn foldl [f z xs]
   (if (null? xs)
       z
       (foldl f (f z (first xs)) (rest xs))))

(defn map [f lst]
   (if (null? lst)
       '()
       (cons (f (first lst)) (map f (rest lst)))))
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么foldreduce视为基本的-当然一切都在来定义的cons,cdrcar这不是看错了吗?

sou*_*eck 6

我认为Rich Hickey在他关于传感器的讨论中完全解释了这一点.

他认为folds这是转型的基本概念.它不需要知道它正在处理什么结构以及如何在该结构上运行.

你只是fold根据自己的定义cdr,carrest.Rich所争论的是,fold它本身就是一个抽象概念,与它所运行的数据结构分开,只要我们提供实际操作数据结构的某些功能,它就会按预期工作.

因此,最终关注的是关注点和可重用性的分离.