• 函数来表达数据


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

  • 相关阅读:
    Redis hyperloglog去重复统计
    linux下对qt编写的程序进行部署
    安装GDBImageWatch ,在QT中查看图像
    整编《计算机视觉中的多视图几何》序言
    快速阅读《QT5.9 c++开发指南》1
    快速阅读《QT5.9 c++开发指南》2
    在Linux下OpenCV的下载和编译
    GOQTTemplate简单介绍
    基础的基于QT的图像查看程序
    基于opencv和QT的摄像头采集代码( GoQTtemplate3持续更新)
  • 原文地址:https://www.cnblogs.com/gaoduan/p/3946896.html
Copyright © 2020-2023  润新知