文档章节

【SICP归纳】2 高阶函数和数据抽象

NoMasp
 NoMasp
发布于 2015/09/08 21:47
字数 1451
阅读 15
收藏 0

上一篇博文对应的是书中的第一章的一二两节,我们已经大致的有了一种构造的感觉不是么。书中展示了很多有趣的句法(syntax)。现在我们要让思想进一步的抽象,写这篇博客的时候并未学完整本书,更不敢说对书中的内容有一个多深的领悟。但我一路学习过来,就感觉书中的示例越来越抽象,作者所引导我们的也是如此方向。博文也会持续更新下去,伴随着我的理解。

在这个专栏的【Scheme归纳】4 高阶函数中已经初步介绍了什么是高阶函数(Higher-order Procedures)。而在这一节中,将用高阶函数来做抽象。书中分了许多小节来逐一介绍这一主题。在“过程作为参数”中,书中用了许许多多的相似示例来概括起一个抽象的操作。lambda用和define同样的方式来创建过程,唯一的区别仅仅是不为过程提供参数。这就是函数式编程和命令式编程的最大区别了,在C++等语言中我们总是会定义许多的变量和常量,而在Scheme中一路下来几乎都是函数。函数与函数之间也不再是用变量等做参数,再用一个return来返回,它可以用过程来作为参数,甚至过程还可以作为返回值。

在第38页前后的各种求和中,这些程序几乎是相同的,没有太多的区别。它们都具有相同条件,相同的谓词和相同的结果,并且这些代换方式都是如此相似。如果现在仔细回想,我们至今为止已经学习了哪些语法,哪些组合,哪些抽象,还有没有学到的常见模式。作者说,计算机应让人快乐,而不是人让计算机快乐。所以人们会创建让自己更容易编写程序、更易于阅读的编程语言,因此就引进了一切抽象的东西。

至今为止一直谈论的过程,仅仅是在提醒我们关于这个语言的框架,我们用原始的东西来构建一个系统。这其中用到了一些组合的手段,通过它把原始的东西做成复杂的事物;用抽象技术来利用复杂的事物以及给它们命名,这就像是搭积木一般。还可以用高阶函数来实现许多常规的方法。就像是书中第45页的不动点搜寻和牛顿法。通过组合起这些抽象将获得无穷的力量。

而这一切的关键思想就是去建立一个分层次的系统。因此举例来说,当我们在写一个求平方根的程序时,程序的某一部分就是用了一个名为good-enough的函数,而在那之间则存在着抽象。作者举例说,如果我们和George一起写一个求平方根的程序,而George的工作就是写good-enough。而我们并不用去关心这个函数是如何进行的。甚至即是George在这里函数里用了Harry写的抽象过程,我们也不用去关心甚至不用知道有这样一个过程或者Harry是不是存在。因为good-enough的细节是由George来完成的。在一个大型系统中,我们许多许多级别的抽象屏障(书中第58页讲解了抽象屏障),而我们要做的就是一遍一遍的去实施程序。

关于数据方面的问题,我们首先要将源数据放在一起组成比较复杂的复合数据,当我们在一组简单数据之上建立复合数据的时候要用到抽象的方法。其次,还要建立系统的层次。书中有有理数的例子来介绍了这一点。

在Lisp上有一个操作符叫做cons,其有2个参数x和y,然后返回一个序对pair。所谓的构造就是通过cons操作,在后面的学习中将会发现,无论是构造队列,甚至是构造流都是通过cons操作。书名中的Structure为名词构造,结构,动词的构造是construct。

上篇博文在控制复杂性部分用了级联一次,第79页就介绍了模块化结构。在真实的信号处理应用中,设计者通常总是从标准化的过滤器和变化装置族中选出一些东西,通过级联的方式构造出各种系统。所谓级联,就是将2种以上的设备、信号等通过某种方式连接到一起。可能我们暂时在实际中还用不到它,但无论如何,数据抽象都是一个强大的技术。

对于数据抽象计数,我最为惊叹的便是Church计数。也即是练习2.6,通过lambda演变就可以创建出所有的自然数和加减乘除。当然了,我的理解有限,不过我相信加减乘除之外的操作也是可以实现的。这道题也有一篇博文来解答:【SICP练习】47 练习2.6



感谢访问,希望对您有所帮助。 欢迎关注或收藏、评论或点赞。


为使本文得到斧正和提问,转载请注明出处:
http://blog.csdn.net/nomasp


版权声明:本文为 NoMasp柯于旺 原创文章,未经许可严禁转载!欢迎访问我的博客:http://blog.csdn.net/nomasp

本文转载自:http://blog.csdn.net/nomasp/article/details/44260093

NoMasp
粉丝 7
博文 334
码字总数 0
作品 0
镇江
程序员
私信 提问
nomasp 博客导读:Lisp/Emacs、Algorithm、Android

版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/44966625 Profile Introduction to Blog 您能看到这篇博客导读...

nomasp
2015/09/17
0
0
JavaScript函数之高阶函数

高阶函数(higher-order function)—如果一个函数接收的参数为或返回的值为函数,那么我们可以将这个函数称为高阶函数。众所周知,JavaScript是一种弱类型的语言:JavaScript的函数既不对输入...

JasonWcx
2014/12/31
1K
2
闭包详解二:JavaScript中的高阶函数

注:文章最末尾有个人公众号二维码,会分享更多技术文章等,敬请关注 本文讲解的高阶函数是之前讲解的闭包的续集,所以在学习高阶函数之前,一定要确保对闭包以及作用域的概念已经有了解: ...

lce_shou
2018/06/05
0
0
JavaScript函数式编程入门经典

一个持续更新的github笔记,链接地址:Front-End-Basics,可以watch,也可以star。 此篇文章的地址:JavaScript函数式编程入门经典 正文开始 什么是函数式编程?为何它重要? 数学中的函数 关...

是方旭啊
05/05
0
0
JavaScript 编程精解 中文第三版 五、高阶函数

五、高阶函数 原文:Higher-Order Functions 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 部分参考了《JavaScript 编程精解(第 2 版)》 Tzu-li and Tzu-ssu were boasting about...

ApacheCN_飞龙
2018/05/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

可见性有序性,Happens-before来搞定

写在前面 上一篇文章并发 Bug 之源有三,请睁大眼睛看清它们 谈到了可见性/原子性/有序性三个问题,这些问题通常违背我们的直觉和思考模式,也就导致了很多并发 Bug 为了解决 CPU,内存,IO ...

tan日拱一兵
35分钟前
3
0
网络七层模型与TCP/UDP

为了使全球范围内不同的计算机厂家能够相互之间能够比较协调的进行通信,这个时候就有必要建立一种全球范围内的通用协议,以规范各个厂家之间的通信接口,这就是网络七层模型的由来。本文首先...

爱宝贝丶
38分钟前
4
0
Jenkins World 贡献者峰会及专家答疑展位

本文首发于:Jenkins 中文社区 原文链接 作者:Marky Jackson 译者:shunw Jenkins World 贡献者峰会及专家答疑展位 本文为 Jenkins World 贡献者峰会活动期间的记录 Jenkins 15周岁啦!Jen...

Jenkins中文社区
56分钟前
10
0
杂谈:面向微服务的体系结构评审中需要问的三个问题

面向微服务的体系结构如今风靡全球。这是因为更快的部署节奏和更低的成本是面向微服务的体系结构的基本承诺。 然而,对于大多数试水的公司来说,开发活动更多的是将现有的单块应用程序转换为...

liululee
今天
8
0
OSChina 周二乱弹 —— 我等饭呢,你是不是来错食堂了?

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @ 自行车丢了:给主编推荐首歌 《クリスマスの夜》- 岡村孝子 手机党少年们想听歌,请使劲儿戳(这里) @烽火燎原 :国庆快来,我需要长假! ...

小小编辑
今天
1K
13

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部