如果不允许使用数值,只能使用函数(过程)。现在已经定义好0和+1操作了。

如何表示1、2、3?如何实现加法?

(define zero
  (λ (f)
    (λ (x) x)))

(define (add-1 n)
  (λ (f)
    (λ (x)
      (f ((n f) x)))))

代换出1

显然,0+1=1

(define one (add-1 zero))

zero带入add-1

(λ (f)
  (λ (x)
    (f ((zero f) x))))

((zero f) x) 做代换,1就出来了

(λ (f)
  (λ (x)
    (f x)))

代换出2

显然,1+1=2

(define one (add-1 one))

one带入add-1

(λ (f)
  (λ (x)
    (f ((one f) x))))

((one f) x) 做代换,2就出来了

(λ (f)
  (λ (x)
    (f (f x))))

代换出……

显然是不用代换了,我们很容易猜测到,用f的调用次数来表示数的大小。

加法

观察add-1

(define (add-1 n)
  (λ (f)
    (λ (x)
      (f ((n f) x)))))

我们写一个add-0 ,其实只用去掉最左侧的f调用即可。

(define (add-0 n)
  (λ (f)
    (λ (x)
      ((n f) x))))

我们想要实现的加法,就在add-0的基础上,再加一个参数m,想办法把m里面f调用给拿出来。

(define (add n m)
  (λ (f)
    (λ (x)
      ((n f) x))));m应该在这儿起到多个f的调用作用

参照((n f) x),最终

(define (f-add n m)
  (λ (f)
    (λ (x)
      ((m f) ((n f) x)))))