上一篇博文对应的是书中的第一章的一二两节,我们已经大致的有了一种构造的感觉不是么。书中展示了很多有趣的句法(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柯于旺 原创文章,如需转载请联系本人。

转载于:https://www.cnblogs.com/NoMasp/p/4786104.html

【SICP归纳】2 高阶函数和数据抽象相关推荐

  1. 【Scheme归纳】4 高阶函数

    高阶函数的介绍 高阶函数的英文名称是Higher Order Function,它们是以函数为参数的函数.主要用于映射(mapping).过滤(filtering).归档(folding)和排序(so ...

  2. Python高阶函数--map、lambda、reduce、filter、zip

    一.map()函数 map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把list 的每个元素依次作用在函数 f 上,得到一个新的 list 并返回. 例如,对于l ...

  3. python四大高阶函数_详谈Python高阶函数与函数装饰器(推荐)

    一.上节回顾 Python2与Python3字符编码问题,不管你是初学者还是已经对Python的项目了如指掌了,都会犯一些编码上面的错误.我在这里简单归纳Python3和Python2各自的区别. 首 ...

  4. Python 2-05 高阶函数

    一.函数式编程 函数是 Python 内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的 ...

  5. Go 学习笔记(61)— Go 高阶函数、函数作为一等公民(函数作为输入参数、返回值、变量)的写法

    函数在 Go 语言中属于"一等公民(First-Class Citizen)"拥有"一等公民"待遇的语法元素可以如下使用 可以存储在变量中: 可以作为参数传递给 ...

  6. 2021年大数据常用语言Scala(三十七):scala高级用法 高阶函数用法

    目录 高阶函数用法 作为值的函数 匿名函数 柯里化(多参数列表) 闭包 高阶函数用法 Scala 混合了面向对象和函数式的特性,在函数式编程语言中,函数是"头等公民",它和Int. ...

  7. Koltin 高阶函数

    高阶函数 高阶函数是将函数用作参数或返回值的函数. 在java中函数和方法是同一个概念, 我就把高阶函数理解为:高阶函数是将方法用作参数或返回值的方法, java中我们要调用方法里面的参数一般需要实现 ...

  8. 函数 tostring_Kotlin实战之Fuel的高阶函数

    Fuel 是一个用 Kotlin 写的网络库,与 OkHttp 相比较,它的代码结构比较简单,但是它的巧妙之处在于充分利用了 Kotlin 的语言特性,所以代码看上去干净利落. OkHttp 使用了一 ...

  9. 【廖雪峰Python学习笔记】高阶函数

    Higher-order function 高阶函数 映射 过滤算法 排序算法 高阶函数 变量可指向函数 >>> abs # 函数 <built-in function abs ...

最新文章

  1. VirtualBox安装64位Linux
  2. 基于OpenCV的区域分割、轮廓检测和阈值处理
  3. Jenkins cve-2016-0792 漏洞复现 Xstream 反序列化漏洞
  4. CSS成长之路----知识点篇
  5. 【CyberSecurityLearning 51】渗透测试方法论+渗透测试流程
  6. 28 March 2019
  7. Idea解决Web server failed to start. Port 8080 was already in use.端口被占用(亲测)
  8. 多商家点餐小程序源码
  9. 【有利可图网】PS教程:制作变形文字
  10. SpringBoot31 整合SpringJDBC、整合MyBatis、利用AOP实现多数据源
  11. 如何下载哔哩哔哩的视频
  12. 2022杭州云栖大会定档11月3日至5日:技术产品发布+超4万平科技展
  13. 无需更改注册表 实现CHM文件从共享文件中直接打开
  14. mysql 索引 二_MySql索引(二)
  15. C语言娱乐项目————6、圣诞树
  16. 如何写朋克摇滚原创歌曲
  17. HALCON示例程序classify_halogen_bulbs.hdev使用SVM分类器检测卤素灯泡的好坏
  18. html网页制作实习,我的网页制作实训报告
  19. python中while True的用处
  20. JavaScript-Pink

热门文章

  1. 为什么 Cloudera 要创建 Hadoop 安全组件 Sentry ?
  2. SGU 274 Spam-filter
  3. if语句使用说明(Java)
  4. python写二进制大文件,如何将文件写入二进制文件,或在大文件中编辑单行– Python...
  5. Linux下eclipse中shell脚本编程环境的搭建
  6. 菜鸟的学习之路(11) — 堆栈与队列
  7. 升级Webwork2.2版本注意点
  8. 将字典直接写入文件,出现中文乱码问题
  9. idea超炫的自定义模板
  10. 1.1 为什么选择Excel绘制论文图表