《计算机程序的构造和解释》-SICP(1):函数式编程思维杂谈

目前sicp看到第三章节,前两章完成了90%的习题,第三章看了一半。这篇文章主要是些杂谈,可能会有些抽象。后面的系列文章会更具体的讲解。SICP这个写作项目,大概会持续至少半年。

先讲讲函数式思维和面向对象,软件设计的一些关系

这本书其实是讲,当一个系统越来越复杂时,怎样管理系统的复杂度。有三个方法,抽象,组合,DSL(领域特定语言)。抽象和组合可以更好地封装代码。让下层的实现细节不会影响到上层的使用。面向对象思维不过是其实一种,还可以通过数据驱动设计,消息传递等其它手段。另外,面向对象思维和面向对象编程语言是两回事。什么意思呢?你用Lisp系语言也可以达到面向对象思维,用C语言也可以。比如linux内核用C写的就很面向对象(我没看过,在哪本书上看到的)。当然你用java这种“纯正”的面向对象语言,你可以显式的定义类,对象。而且你不用管那么多细节,比如垃圾回收,这个虚拟机会帮你做。但你用C语言可不行,你要自己做。各有优势。

所谓函数式思维编程,这里的函数,不是编程语言中的函数,而是数学中的,数学中的函数强调一对一映射。什么意思呢?就是给定相同的参数x,就一定会得到相同的结果,在严格的函数式思维中,变量是代数中的变量,一个值的名称,它是不可能改变的。而在命令式语言中,变量是存储状态的单元,可以改变,可以被赋值的,比如x = x+1,但是这个表达式在数学看来就是不可取了。

函数式思维中,也是没有循环的,在普通的java循环中,是要有一个变量做累积的,比如i++,即i = i +1。纯函数编程语言无法实现循环,这是因为For循环使用可变的状态作为计数器,而While循环需要可变的状态作为跳出循环的条件。因此在函数式语言里就只能使用递归来解决迭代问题,这使得函数式编程严重依赖递归。严格意义上的函数式编程意味着不使用可变的变量,赋值,循环和其他命令式控制结构进行编程。

那么到底是命令式编程语言好,还是函数式好呢?调用《道德经》的思维:没有对错,只有合适不合适。两种语言都有它们的最适用场景。面向对象的本质是什么?OOP之父Alan Kay说:“OOP is all about messaging”,利用OOP建模,就是在各个对象中传递消息。而现实的大多业务场景,都可以建模成人或者其它对象的协作,通过消息来协作。比如你下个订单,这个对象的库存数减少,新建一个订单对象,等等。这种场景,用OOP是很自然的建模过程。当然你用函数式编程的各种函数“动作”来建模这个过程也是可以的。但是这个场景,用OOP和FP,哪个更好理解呢。举另外一个场景,你就是对一组数据做加工,先排序,再查询,然后再转换。这个场景,显然用FP来建模更自然,这一看就可以看成是一个“管道”过程。

result = (f1(f2(f3...(fn data))))..

但如果这个场景用OOP语言呢?每个过程建立一个class?这很别扭。不简洁。

另外,因为函数式编程的不可赋值特性,让它在并发处理上有优势,SICP上有讲,我还没理解透这块。

总结下就是:一个业务,它抽象成OOP更自然,用OOP,抽象成函数过程更好理解,用FP。

**那么,函数式思维和命令式语言最本质的区别是什么?**命令式语言,它是按照这件事“怎么做”一步一步去执行的,而函数式语言不同,它是描述“是什么”,它不管你完成一件事的具体步骤,相当于数学中的表达式求值。所以这会更抽象。

比如我们要对一个列表操作,让它每个数都开平方。怎么做呢?用python:

list1 = [1, 2, 3, 4]
list2 = []
for i in list1:
  a = i * i
  list2.append(a)
# 这种思维是把列表里的数先转换,再加到表里去。一个一个的进行。

用scheme:

;通过描述一个 旧列表->新列表 的映射,而不是描述「从旧列表得到新树应该怎样做」来达到目的

(define (square x) (* x x))
(define list1 (list 1 2 3 4))

;输出结果:
> (map square list1)
(1 4 9 16)

先说到这,下一篇文章写什么呢?写高阶函数或者数据导向的程序设计和可加性。

Changelog:

20200710 15:40: 完成草稿

20200711 11:09:完成文章

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《计算机程序构造解释》是一本经典的计算机科学教材,它由Harold Abelson和Gerald Jay Sussman创作,已经成为计算机科学领域的里程碑之一。该教材于1979年首次出版,最新版是第二版。 该书的主要内容包括两个方面:计算机程序构造解释。首先,它详细解释计算机程序构造,强调了程序的基本要素和组织原则。这可以帮助读者理解如何使用编程语言和工具构建高效和可靠的计算机程序。书中还介绍了一些常见的编程范式和设计模式,如函数式编程面向对象编程,使读者能够选择适合自己项目的最佳方法。 其次,该书解释计算机程序解释过程。它介绍了一种称为Lisp的编程语言,这是一种函数式编程语言,非常适合表达和解释复杂的计算机程序。通过详细讲解Lisp的语法和语义,读者可以深入了解程序如何被计算机解释和执行。这对于理解计算机底层工作原理和实现高性能程序非常有帮助。 《计算机程序构造解释》被广泛认为是计算机科学入门的必读教材。它不仅适合计算机科学专业的学生学习,也适合对计算机程序有兴趣的非专业读者。该书的内容深入浅出,兼具理论和实践,读者可以通过阅读本书并进行相应的练习来提高他们的编程能力和计算机科学理解。 总之,《计算机程序构造解释》是一本经典的计算机科学教材,它介绍了计算机程序构造解释两个重要方面。通过学习本书,读者可以掌握构建高效和可靠程序的技巧,并深入理解计算机程序的执行过程。这本书对于计算机科学专业学生以及对计算机程序感兴趣的非专业读者都是极其有价值的。 ### 回答2: 《计算机程序构造解释》(简称SICP)是一本经典的计算机科学教材,该书由麻省理工学院的编程语言专家哈罗德·艾布尔森(Harold Abelson)和吉拉迪·塞斯曼(Gerald Jay Sussman)共同编写。它在计算机科学领域具有重要的地位和影响力。 该书的主要内容围绕着计算机程序构造解释展开。它从一个通用的编程语言(Scheme)出发,通过讲解计算机程序的抽象、过程和数据的重要概念,帮助读者建立起正确的思维模式和编程方法。 SICP通过一系列的例子和习题,引导读者通过编程实践来加深对计算机程序的理解。它强调程序设计的原理、模块化、抽象和递归等重要思想,通过一步步的讲解和示例,帮助读者培养出优雅和高效的编程风格。 SICP的目标是让读者真正理解计算机程序的本质,并学会如何用一种简单而强大的编程语言来构建复杂的软件系统。它不仅仅是一本教科书,更是一部引导读者探索计算机科学本质的指南。 总的来说,《计算机程序构造解释》是一本重要的计算机科学经典教材,它的初版已经出版超过30年,至今仍然是计算机科学教育领域的重要参考书之一。阅读该书可以帮助读者真正理解计算机程序的本质和设计原则,提升编程能力和思维方式。 ### 回答3: 《计算机程序构造解释》(SICP)是一本经典的计算机科学教材,也是学习编程的重要参考书籍。 这本书以文学化的形式介绍了计算机程序是如何构造解释的。它通过简明易懂的语言和丰富的示例,向读者解释了编程语言的设计原则、计算过程的原理以及如何理解和构造复杂的程序。 SICP主要分为五个部分。第一部分介绍了程序设计的基本概念和过程抽象的重要性。第二部分介绍了数据抽象和高阶过程,帮助读者理解程序设计中的重要概念和方法。第三部分讨论了程序设计的不同风格和编程的复杂性。第四部分介绍了元语言解释器的实现,帮助读者理解编程语言的工作原理。第五部分则介绍了一些高级主题,如并发和非确定性计算。 这本书的独特之处在于它不仅仅教授编程语言的具体细节,更重要的是让读者理解程序设计的理念和基本原则。它培养了读者逻辑思维和问题解决能力,帮助他们成为更好的程序员。 对于那些想要深入理解计算机程序构造解释的人来说,这本书是一个不可或缺的工具。它挑战了读者的思维,让他们思考计算机程序的本质和原理。无论是初学者还是有经验的程序员,阅读《计算机程序构造解释》都会有所收获,成为更好的计算机科学家或工程师。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值