函数和数据在一般语言里严格区分,函数的限制非常多,仅作为接受数据来处理的工厂,而在函数式语言中,函数是first-class,拥有很大的自由性和表达力。
比如,它让你重新思考什么是0,什么是1,它可以让你来定义0和1,比如这样:
这是0
(define zero (lambda (f) (lambda (x) x)))
这是1
(define one ( lambda (f) (lambda (x) (f x))))
这是2
(define two (lambda (f) (lambda (x) (f (f x)))))
这是加法,可以用来定义其它的整数
(define (plus a b)
(lambda (f) (lambda (x) ((a f) ((b f) x)))))
其实这里的0 1 2 …… 是函数迭代,0表示迭代0次,所以不调用f; 1表示迭代1次,调用一次f;2表示迭代2次,将计算结果作为参数给f再算一次 ……
所以这里的加法的实质是: 对于某个数b, 给它一个函数f作为参数,此时的b变成f函数对x自变量的b次迭代,将迭代的结果给 a f再做a次迭代,即是a+b次迭代。
函数用来表示整数,还可以用来表示其它数据结构:
比如pair(将两个数据绑定在一起),pair的本质不在于如何将二者联系起来,而是我们可以从中得到第一个,得到第二个,不会丢失数据,不会破坏相对关系。
比如:
(define (pair x y)
(lambda(m)
(cond ((= m 0) x)
((= m 1)y)
(else (error "error!")))))
(define (first p)
(p 0))
(define (second p)
(p 1))
;test
(define p (pair 1 (pair 2 3) ))
(first p) ;1
(first (second p)) ;2
(second (second p)) ;3
更重要的是,pair之后的结果还可以继续用来pair,这样可以用来形成list,形成二叉树等等,由于这个闭包性质的存在,使得数据结构的扩展变得容易,也使得相应数据结构的递归处理容易实现。