• 函数来表达数据


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

  • 相关阅读:
    佛教-著作:《般若泼若密心经》
    学科-几何:分形几何学
    战国-散文:《生于忧患,死于安乐》
    北宋-词:《临江仙·送王缄》
    音乐:《河西走廊之梦》
    影视-纪录片:《河西走廊》
    汉语-汉字:黾
    动物-昆虫:水螳螂
    动物-昆虫:水黾
    主程的晋升攻略(3):IP、DNS和CDN
  • 原文地址:https://www.cnblogs.com/gaoduan/p/3946896.html
Copyright © 2020-2023  润新知