scheme 的 map filter reduce 实现

目录

对于函数式编程 map,filter,reduce 都会经常被使用到,SICP 里面有很多给人魔术一样的感觉,就是用最简单的语法实现令人感觉神奇的效果。
SICP 里面就使用了最基本的语法实现了 map,filter,reduce

map 实现

(define (map proc items)
  (if (null? items)
      '()
      (cons (proc (car items)) (map proc (cdr items)))))

(map (lambda (x) (+ 1 x)) '(1 2 3))
; => (2 3 4)

filter 实现

(define (filter predicate sequence)
  (cond ((null? sequence) '())
        ((predicate (car sequence))
         (cons (car sequence)
               (filter predicate (cdr sequence))))
        (else (filter predicate (cdr sequence)))))

(filter odd? '(1 2 3 4))
; => (1 3)

reduce 实现

(define (reduce proc items)
  (if (null? items)
      0
      (proc (car items) (reduce proc (cdr items)))))


(reduce (lambda (a b) (+ a b)) '(1 2 3))
; => 6
; 这个 reduce 的实现只能针对数值的计算

总结

SICP 里面到处都充满了这样的魔法,用最简单的 if,cond, car,cdr,cons 和递归就能实现很有用的抽象,比看魔术还精彩。

目录