诡秘深奥的现代魔法 1.3 上

用高阶函数做抽象

终于来到这里了,前面的大都是开胃菜,我们常说的函数式编程最大的特点就是,函数也像一个数据一样可以被放进数据结构里面,也可以作为参数传入,作为返回值,在程序中动态生成,一个常用的行话叫做:把函数作为一等公民。

这个特性能让程序的表现力大大提高,以至于很多新旧语言都吸纳了这个特性。我们从现在开始真正学习抽象这个极其有力的魔法,到了这本书后面你就会觉得,自己动手让没有 OO (面向对象)特性的 Scheme 语言支持 OO 实在是一件简单的事情。有人想对 C 这样做,最后出来的是 C++!玩笑玩笑。

言归正传,书中也讲了,高阶过程就是将过程作为参数或者返回值的过程,在数学里面很高端地叫做“泛函”,还有一个高大上的数学分支叫做“泛函分析”,我是完全搞不懂啦。

1.3.1 过程作为参数

而一般来说编程语言能重用代码,但是整个函数的结构是不能重用的。在这一小节,可以看到把过程作为参数能将程序中的某种“结构”给抽象出来,在这种情况下,高阶过程可以类似于一类函数的“模板”,可以说往下很多的内容都是在教读者怎么强有力的抽象。

这一小结的练习比较简单,值得一提的是注释 51,练习 1.31 ~ 1.33 其实是对后面的铺垫。学到后面的信号流处理你也一定会被美丽强大的抽象魔法折服的。

1.3.2 用 lambda 构造过程

这一节没什么好说的,介绍给我们两种工具。

值得注意的是,书中也明确写了,这两种工具一个是语法糖的“本体”,另一个则就是语法糖。Scheme 里面有很多语法糖,一种语法本质上来说就是变换成另一种比较繁琐却又很容易理解的语法,比如说就如书上说的:

(define (foo bar) (+ bar 1))

本质上就是:

(define foo (lambda (bar) (+ bar 1)))

也就是说,lambda 就是本质上声明函数的过程。函数本无名,和普通的数字或者字符串一样,名字并不是函数内在的属性而是外界给其加上的。

这些语法糖意味着的就是程序核心的精简,Scheme 使用者津津乐道的就是 Scheme 标准非常薄,中文的 R5RS包括附录和文献仅仅 45 页。

1.3.3 过程作为一般的方法

接下来又是 SICP 最喜欢干的数学实例,别的编程入门书,一般也就写个图书管理程序什么的,就这书最喜欢诸如圆周率、斐波那契、快速求幂、牛顿法定积分什么的了。

书中实例是将函数作为参数传入,然后过程对这个函数进行分析返回结果。本身虽然因为我数学太弱看起来有点吃力,但其实也没什么难的,来看后面的练习。

练习 1.35

虽然看“证明”两字让人菊花衣襟,证明的内容也是那么销魂,不过把黄金分割率代入进去就解决了……喂。

诡秘深奥的现代魔法 1.3 上》上有10条评论

  1. noob

    SICP ch1很多用数学实例多是因为数学函数很多是纯函数方便表达过程抽象.
    而且感觉上SICP很多例子加起来可以构成了个CAS了,前言那里作者就提及了从Macsyma里学到不少东西

    回复
  2. Pingback引用通告: 诡秘深奥的现代魔法 – SICP 读书笔记 0 | 蛋炒饭

发表评论

电子邮件地址不会被公开。 必填项已用*标注