【SICP归纳】3 层次性数据和符号数据

在学习书中第二章的时候有个问题一直让我很困扰,那就是2.2.4节的实例,因为没法输出书中华丽的图案,只能是一对英文字母。这在几个月前浅浅的学了一会Common Lisp的时候也是如此,当时看到书中有个实例是书中输出了很赞的线条,而我只会输出一堆点。后来才知道让Lisp输出图形化界面是更高层次的工程,想想还是先把SICP搞定。

上一篇博文中我们谈到了复合数据,关于它有两个重点。第一,数据抽象,这也就意味着你可以隔离那些数据对象。第二,在Lisp中有个特殊的方式能够黏住一些东西,它就是pair,而cons、car、cdr的实现方式我们暂时不必去研究。在BASIC和Fortran中构造一个数组并不是一个闭合的操作,因为你可以用数字、字符串和其它东西来构造数组,但你不能用数组来构造数组。而当你看着组合的定义时,你应该看看这些东西在组合的定义下是否是闭合的。因为我们可以形成序对的序对,我们就可以用序对用各种方式粘起各种东西。比如我们用1、2、3、4来构成一个序对,就可以有非常多种方式,一下只是一部分,而且还仅仅是按照大小顺序来构造的。

(cons 1 (cons 2 (cons 3 4)))
(cons (cons 1 2) (cons 3 4))
(cons (cons 1 (cons 2 3)) 4)
(cons 1 (cons (cons 2 3) 4))
(cons (cons (cons 1 2) 3) 4)

而且在任意的序对中,都可以有car、cdr的组合来得出其中的任一元素。我们可以建立元素本身也是序对的序对,这就是表结构得以作为一种表示工具的根本基础。我们将这种能力称为cons的闭包性质(the closure property of cons)。一般说,某种组合数据对象的操作满足闭包性质,那就是说,通过它组合起数据对象得到的结果本身还可以通过同样的操作再进行组合。闭包性质是任何一种组合功能的威力的关键要素,因为它使我们能够建立起层次性的结构(hierarchical structures),这种结构由一些部分构成,而其中的各个部分又是由它们的部分构成,并且可以如此继续下去。

在2.2.4节中,我们怎样在如此短的时间内就可以用简单图片来构造出复杂的图片,这就是因为Lisp有闭包的性质。我们可以拿一张图片来得到另一张beside版的图片,而且这张图片还可以rotate和flip,或者用这所有的操作。关于这部分作者说:When I take that element P, which is the Beside or the Flip or the Rotate of something, that’s, again, a picture. The world of pictures is closed under those means of combination. So whenever I have something, I can turn right around and use that as an element is something else. So maybe better than List and segments, that just gives you an image for how fast you can built up complexity, because operations are closed.

一个复杂的系统应该通过一系列的层次构造出来,为了描述这些层次,需要使用一系列的语言。构造各个层次的方式,就是设法组合起作为这一层次中部件的各种基本元素,而这样构造出的部件又可以作为另一个层次里的基本元素。在分层设计中,每个层次上所用的语言都提供了一些基本元素、组合手段,还有对该层次中的适当细节做抽象的手段。分层设计有助于使程序更加强健,使我们更有可能在给定规范发生一些小改变时,只需对程序做少量的修改。

我们可以组合东西,可以递归过程,可以做各种事情,而且这些都是自动的。我们仅仅使用语言的句法和将句法嵌入语言,这样我们就不会失去语言最原始的能力。表最伟大的是什么,如果只是用表去做一些尖刻的问题,这便是一门糟糕的语言。而去补充你想要的语言并且将其嵌入到表中,这才是表的伟大之处。这也正是所谓实现的真正力量——去设计一门语言。我们甚至可以走得更远,用表来让常规方法像高阶函数一样完成一些事情。

这里有一个层次允许我们去创建一个原始的图片,然后我们对图片进行各种操作。这些操作所发生的事情归结起来就是Henderson创建的图形语言。而且在这之上,我们也看到了由组合构成的schemes,由schemes构成的语言。比如说这里反复地使用一个比例系数。在这个层次所拥有的,这些被提到的事物被架设到上一个层次。事实上每一个节、每一个到这一层次的分解都被设计成执行具体的任务,而在其他层次,你却拥有全方位的力量。在任何层次,它没有被设置成一个具体的任务,而是被设置成整个范围。这一设计的结果就是被设计在方法中的功能更加健壮。

如果你在函数的描述中做些改变,它更可能是由相应的变化所捕获,在这里语言也会自动在下一级别执行,因为你已经完全控制了这一个层次。所以如果不是在谈论一个具体的函数,比如说Beside,那么你便拥有全局的控制,所以如果去进行一点点的改变,更可能的便是你的方法将有能力去捕获、去适应这一改变。而这样的设计则不会是强大的,因为如果我去改变一些东西,可能会影响整个层次,进而进入树的下一层。

对于由表,亦或是由符号来构造的软件的方法,去设计过程与其说是实现一个程序,不如说是构造一门语言。如果要构造出表(a b),不能用(list a b),因为这构造出来的是a和b的值的表,而不是这两个符号本身的表。因为假如a和b都被define定义成了具体的数值,比如1和2,那么(list a b)得出来的就是(1 2)而不是(a b)了。引号是很有威力的东西,因为它使我们可以构造起一种能操作其他表达式的表达式。所以我们应该用要这样写:(list ‘a ‘b)。

符号求导是一个挺难的部分,在这样有一个很重要的思想,在后面的习题中会有很多体现,那就是按愿望思维。所谓的思想,对于不同的编程语言都是通用的,这也就是为什么SICP是学习函数式编程最好的书籍。即便对于C等语言也是如此,当需要完成一个操作时,我们写了一个函数,一个类,但这个函数可以还要调用其它的函数,这个类也可能是由其它类继承而来。Lisp也是支持面向对象编程的,只不过比较痛苦。




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



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


时间: 2024-07-29 06:07:48

【SICP归纳】3 层次性数据和符号数据的相关文章

mysql导入数据特殊符号出错问题

问题描述 mysql导入数据特殊符号出错问题 ,无论将编码都设成gbk还是utf8都出现同样的报错,就这有特殊符号的这一行.日志是服务器端自动记录的,偶尔还会出现其他的乱码特殊符号,替换的话,开销太大.有什么方法可以实现成功导入到数据库呢? 解决方案 统一一下你的项目编码,比如无论导入导出,都使用utf-8 解决方案二: 创建数据库时,将编码改为Latin2,就可以导入了.究竟该怎么解决这个问题呢.来人帮忙啊

周轶璐教授:服务好医生,如何更全面地了解数据、利用数据?

进入2017年,人工智能与医疗的结合受业界瞩目,后者被认为是AI最有可能率先实现商业化的领域.在此背景下,人工智能到底该如何与医学场景真正结合?或者说AI能为医疗行业带来些什么? 美国福特汉姆大学副教授周轶璐在近日的一个论坛上给出了他的看法. 在他看来,现在各处都有医疗的相关数据,这些数据杂乱无章,如果利用AI就能很好地将这些数据分类,进而更好地为医护人员提供便利:另外,如果利用数据挖掘及机器学习的方法对这些数据进行分析,还可以知悉数据背后的"含义",从而发现病灶并预测个人的健康状况.

《大数据、小数据、无数据:网络世界的数据学术》一 2.2 定义与术语

2.2 定义与术语 学术文献.政策声明和大众媒体中到处都充斥着对数据的讨论,它们都尝试定义业内术语.罗森博格(Rosenberg 2013)指出,即使是在科学史和认识论历史中,人们也只是在无意间提及数据(Blair 2010:Daston 1988:Poovey 1998:Porter 1995).其他在科学领域中讨论事实(fact).表示(representation).记录册(inscription)和出版(publication)等含义的基础性作品也很少关注数据本身(Bowker 2005

跟我一起数据挖掘(14)——数据整理与数据归约

在我们需要整理的数据中,很多都是经过不同时间由于各种原因生成的数据,有的是可以追溯到源头的,有的是很难追溯的. 通常我们会将所有的数据通过各种方式将数据字典收集到一起,然后进行相应的分析. 下面介绍一下使用powerdesigener进行数据整理: 1.在Windows的ODBC数据源中陪着你的数据源,在"系统DNS"中配置你的数据源,配置细节大家都应该非常熟悉不再讲解.如图: (这里也可以使用jdbc,看具体的连接方式了). s 2.在PowerDesigner中,新建一个pdm,选

反复分析-一次添加一个数据,新数据将影响已有数据分析结果,如何进行设计?

问题描述 一次添加一个数据,新数据将影响已有数据分析结果,如何进行设计? 10C 我做的是股票数据分析.只关注股票的最高价和最低价.以三根K线关系,可以分为下降序列,就是3个K线一个比一个低.上升序列,一个比一个高.顶分型,中间高两边低,底分型,中间低两边高.如图:下降序列:| | | 上升序列: | | | 顶分型: | | | 底分型: | | | 假设已经有了3根初始的K线,容易判断出当前属于什么类型. 接下来会添加一根K线的数据.然后分析这4根K线会如何组合. 比如底分型,如果新加K线呈

中国科学院院士怀进鹏:大数据及大数据的科学与技术问题

第五届中国云计算大会于2013年6月5-7日在北京国家会议中心拉开帷幕.本次大会以国际视野,洞悉全球云计算发展趋势,并从应用出发,探讨云计算与大数据.云计算与移动互联网.云安全及云计算行业应用等焦点话题.大会还特别设立了云计算服务展示区域,交流国际云计算最新研究成果,展示国内云计算试点城市发展成就,分享云计算发展经验,促进全球云计算创新合作. 中国电子学会云计算专家委员会候任主任委员.中国科学院院士 怀进鹏 在第五届云计算大会第二天的演讲上,中国电子学会云计算专家委员会候任主任委员.中国科学院院

大数据思维与数据挖掘能力正成为大型商业银行核心竞争力

◆ ◆ ◆ 摘要 大数据能力特有的性质,使其正在成为大型银行真正的核心竞争力.银行大数据能力表现在多方面,但大数据思维和数据挖掘能力是最关键.也是最重要的.数据挖掘对银行竞争力的影响主要表现在客户洞察.营销规划.产品创新.风险管理.流程优化.网点选址和人力资源管理等方面.大数据价值的实现,关键在于挖掘分析能力.数据挖掘可以推动商业银行战略转型.提升运营管理能力.重塑银行企业文化.促进风险经营的精细化专业化.银行数据挖掘能力建设的关键是行动,行动中需要考虑许多因素,包括挖掘分析工具和方法.数据获取

【SICP归纳】4 模式匹配和以规则为基础的代换

在书中符号数据一节中,作者写了关于微积分的演算规则的程序.这是一个很程序化的程序,我们所做的是在讲这些(数学)规则翻译成计算机语言.因为它有程序化的行为和结构,那么存在其他的方法使书写这个程序更加清晰吗?这些规则都具有左右两侧.左侧是我们想要采取的导数的表达式,有右边则是其的替代. 用可以匹配的模式,和能够代换的框架,可以得到新的表达式.所以这意味着模式是对源表达式的匹配,并且规则的应用的结果是去产生一个新的表达式,而这个表达式是通过实例化一个框架来传入的目标参数.这就是所谓的实例化.而整体范围

大数据不只是数据大 全面解析大数据

在写这篇文章之前,我发现身边很多IT人对于这些热门的新技术.新趋势往往趋之若鹜却又很难说的透彻,如果你问他大数据和你有什么关系?估计很少能说出一二三来.究其原因,一是因为大家对新技术有着相同的原始渴求,至少知其然在聊天时不会显得很"土鳖";二是在工作和生活环境中真正能参与实践大数据的案例实在太少了,所以大家没有必要花时间去知其所以然. 我希望有些不一样,所以对该如何去认识大数据进行了一番思索,包括查阅了资料,翻阅了最新的专业书籍,但我并不想把那些零散的资料碎片或不同理解论述简单规整并堆