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.下面是map与filter来讲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,rest和cons(car,cdr和cons):
(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)
我的问题是为什么fold而reduce视为基本的-当然一切都在来定义的cons,cdr和car?这不是看错了吗?
| 归档时间: |
|
| 查看次数: |
558 次 |
| 最近记录: |