函数来表达数据

函数和数据在一般语言里严格区分,函数的限制非常多,仅作为接受数据来处理的工厂,而在函数式语言中,函数是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,形成二叉树等等,由于这个闭包性质的存在,使得数据结构的扩展变得容易,也使得相应数据结构的递归处理容易实现。

原文地址:https://www.cnblogs.com/gaoduan/p/3946896.html