Church Counter(邱奇计数)

(define zero (lambda (f) (lambda (x) x)))
(define (add-1 n) (lambda (f) (lambda (x) (f ((n f) x)))))

我们把zero带入add-1

(lambda (f) (lambda (x) (f ((lambda (f) (lambda (x) x)) f) x)))
 => (lambda (f) (lambda (x) (f ((lambda (x) x) x))))
 => (lambda (f) (lambda (x) (f x)))

这个时候我们可以和zero比较,就会发现里面多了一次f操作,这就是计数操作

one, two可以写为

(define one (lambda (f) (lambda (x) (f x))))
(define two (lambda (f) (lambda (x) (f (f x)))))

(add m n)可以写为

(define (add m n) (lambda (f) (lambda (x) ((m f) ((n f) x)))))

下面摘自 《程序员的呐喊

在最遥远的国度,比函数式王国更远的地方,有一种传说中的地带叫做lambda the ultimate。相传那个地方根本没有名词,只有动词。虽然那里有东西,但它们皆由动词创造,若传闻不虚,那地方连睡觉前数羊用的数字也不例外,而羊是当地最流行的货币。数字0就是lambda(), 1则是lambda(lambda()), 2则是lambda(lambda(lambda()), 以此类推。在这个传奇国度,每样东西不管是名词动词还是其他什么,都是由lambda这个初始动词开始构建出来的。