如果不允许使用数值,只能使用函数(过程)。现在已经定义好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)))))