上一篇博文相应的是书中的第一章的一二两节,我们已经大致的有了一种构造的感觉不是么。

书中展示了非常多有趣的句法(syntax)。

如今我们要让思想进一步的抽象。写这篇博客的时候并未学完整本书。更不敢说对书中的内容有一个多深的领悟。但我一路学习过来。就感觉书中的演示样例越来越抽象,作者所引导我们的也是如此方向。博文也会持续更新下去,伴随着我的理解。

在这个专栏的【Scheme归纳】4 高阶函数中已经初步介绍了什么是高阶函数(Higher-order Procedures)。

而在这一节中,将用高阶函数来做抽象。书中分了很多小节来逐一介绍这一主题。

在“过程作为參数”中,书中用了许很多多的类似演示样例来概括起一个抽象的操作。lambda用和define同样的方式来创建过程。唯一的差别不过不为过程提供參数。这就是函数式编程和命令式编程的最大差别了,在C++等语言中我们总是会定义很多的变量和常量,而在Scheme中一路下来差点儿都是函数。函数与函数之间也不再是用变量等做參数,再用一个return来返回。它能够用过程来作为參数,甚至过程还能够作为返回值。

在第38页前后的各种求和中,这些程序差点儿是同样的,没有太多的差别。

它们都具有同样条件,同样的谓词和同样的结果,而且这些代换方式都是如此类似。假设如今细致回忆。我们至今为止已经学习了哪些语法,哪些组合,哪些抽象,还有没有学到的常见模式。作者说,计算机应让人快乐。而不是人让计算机快乐。

所以人们会创建让自己更easy编敲代码、更易于阅读的编程语言。因此就引进了一切抽象的东西。

至今为止一直谈论的过程。不过在提醒我们关于这个语言的框架,我们用原始的东西来构建一个系统。这当中用到了一些组合的手段,通过它把原始的东西做成复杂的事物;用抽象技术来利用复杂的事物以及给它们命名,这就像是搭积木一般。还能够用高阶函数来实现很多常规的方法。就像是书中第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


$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('

    ').addClass('pre-numbering').hide();
    $(this).addClass('has-numbering').parent().append($numbering);
    for (i = 1; i ').text(i));
    };
    $numbering.fadeIn(1700);
    });
    });

【SICP归纳】2 高阶函数和数据抽象的更多相关文章

  1. Python高阶函数--map

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

  2. Scheme 4 Javaer-3.高阶函数

    1.3  Formulating Abstractions with Higher-Order Procedures 教材有时候依照学生的基础.从0讲起:有时候给出一个大图,然后具体地逐一介绍. 本文 ...

  3. c#语言-高阶函数

    介绍 如果说函数是程序中的基本模块,代码段,那高阶函数就是函数的高阶(级)版本,其基本定义如下: 函数自身接受一个或多个函数作为输入. 函数自身能输出一个函数,即函数生产函数. 满足其中一个条件就可以 ...

  4. swift 的高阶函数的使用代码

    //: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...

  5. JavaScript高阶函数

    所谓高阶函数(higher-order function) 就是操作函数的函数,它接收一个或多个函数作为参数,并返回一个新函数. 下面的例子接收两个函数f()和g(),并返回一个新的函数用以计算f(g ...

  6. python--函数式编程 (高阶函数(map , reduce ,filter,sorted),匿名函数(lambda))

    1.1函数式编程 面向过程编程:我们通过把大段代码拆成函数,通过一层一层的函数,可以把复杂的任务分解成简单的任务,这种一步一步的分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. ...

  7. python学习道路(day4note)(函数,形参实参位置参数匿名参数,匿名函数,高阶函数,镶嵌函数)

    1.函数 2种编程方法 关键词面向对象:华山派 --->> 类----->class面向过程:少林派 -->> 过程--->def 函数式编程:逍遥派 --> ...

  8. Scala的函数,高阶函数,隐式转换

    1.介绍 2.函数值复制给变量 3.案例 在前面的博客中,可以看到这个案例,关于函数的讲解的位置,缺省. 4.简单的匿名函数 5.将函数做为参数传递给另一个函数 6.函数作为输出值 7.类型推断 8. ...

  9. Python之路 day3 高阶函数

    #!/usr/bin/env python # -*- coding:utf-8 -*- #Author:ersa """ 变量可以指向函数,函数的参数能接收变量, 那么 ...

随机推荐

  1. 状态压缩动态规划 -- 棋盘问题 POJ 1321

    一个 N * N 的棋盘上面,有些格子不能放,放置 M 的棋子, 每两个棋子不能在同一行或者同一列,问有多少种放法 DFS太慢,用SCR好点点 Python 仅仅有 22 行,事实上能够更短.可是得排 ...

  2. [计算机基础]关于实体( Entity )和模型( Model )

    实体与模型的浅析 在日常开发过程中经常看到Entity,Model,DataModel,它们之间到底有什么异同?下面是我个人的一些理解. 一.Entity,Model,它们是什么? 维基百科描述: 实 ...

  3. minidump详细介绍

    Effective minidump 简介 在过去几年里,崩溃转储(crash dump)成为了调试工作的一个重要部分.如果软件在客户现场或者测试实验室发生故障,最有价值的解决方式是能够创建一个故障瞬 ...

  4. 编程之美2013 初赛一 A - 竞价 学习大牛的思路

    这题我做了N久也做不出....赛后看了大牛AC的思路.... Program: #include<iostream> #include<cmath> #include<s ...

  5. [置顶] Bug 11775332 - cluvfy fails with PRVF-5636 with DNS response timeout error [ID 11775332.8]

    Bug 11775332  cluvfy fails with PRVF-5636 withDNS response timeout error but error text is not clear ...

  6. 关于使用commons-email包测试发送邮件遇到的问题

    项目中有个需求是这样的:客户办理某一项业务,当用户成功提交业务办理信息后,系统生成一个业务随机码给用户,以此作为以后的业务办理结果查询依据.鉴于随机码较长,方便用户记录,在生成随机码的同时,提供用户发 ...

  7. STL 源代码分析 算法 stl_algo.h -- includes

    本文senlie原,转载请保留此地址:http://blog.csdn.net/zhengsenlie includes(应用于有序区间) ------------------------------ ...

  8. Android开发周报:反编译对抗研究、动手制作智能镜子

    新闻 <Android Wear落地中国 谷歌增强安卓生态控制力> :9月8日,由摩托罗拉推出的智能手表Moto 360二代作为国内发售的第一款搭载官方Android Wear的设备,正式 ...

  9. 2013 吉林通化邀请赛 Play Game 记忆化搜索

    dp[ba][ta][bb][tb]表示a堆牌从下面拿了ba张,从上面拿了ta张.b堆牌从下面拿了bb张,从上面拿了tb张.当前玩家能得到的最大的分数. 扩展方式有4种,ba+1,ta+1,bb+1, ...

  10. Linux共享wifi给Android手机

    亲測可行,測试系统:Deepin2014,Ubuntu也一样.步骤很easy. 1.卸载hostapd,sudo apt-get remove hostapd(假设原来装过的话卸载,由于某些版本号不支 ...