《函数式编程思维》一书深刻阐述了函数式编程的核心理念和优势,强调函数作为一等公民的重要性,以及纯函数和不变性带来的好处。作者通过丰富的案例和实践经验,引导读者转变思维方式,提倡函数式编程的实践,为读者打开了函数式编程的新世界。
《函数式编程思维》读后感(一)
本书脱离特定的语言特性,关注各种OOP语言的共同实践做法,展示如何通过函数式语言解决问题。例如,如何利用函数式语言,通过高阶函数、多元方法等完成代码重用。知名软件架构师Neal Ford为我们展示不同的编程范式,帮我们完成从Java命令式编程人员,到使用Java、Clojure、Scala函数式编程人员的完美转变,建立对函数式语言的语法和语义的良好理解。
《函数式编程思维》读后感(二)
首先书比较薄,集中抽出一天的时间就可以读完。
其次说一下内容,主要讲解了函数式的思维方法对比了面向对象编程方法中的实现和在函数式编程中的不同。
最后,读完之后还是有收获的,可以按照章节顺序进行读,内容不是很难懂,有些例子自己要实现一下然后结合作者的描述思考一下
目前在大数据和机器学习火热的时候,函数式编程得确有其得天独厚的优势,如果要从事这两方面的工作,推荐阅读一下这本书。
《函数式编程思维》读后感(三)
我根本不知道怎么来评价这本书,因为这本书我拖了很久很久才看完,原因也不是因为我拖,想来想去是这本书怪。
总结起来可能是——我懂的地方书里提到了,能看懂;我不那么懂的地方书里提到了,我依然看不懂。
书的第一章是很精彩的,一步步带领读者将命令式改写成函数式:用上流畅接口、加上 map reduce filter、把一个循环里的几件事拆成几个 stream,每个 stream 里做一件事。看第一章的时候,我对这本书的期待值变得很高:如此绝妙,一定是天人之姿。
呵呵。第二章开始罗列 Scala、Groovy 和 Clojure 里的 map reduce filter 是怎么使用的,我对这仨基于 JVM 的语言毫无兴趣,根本不想看啊。忍着,忍到最后,发现整本书都是用这三个语言,通过代码的实现来论证作者自己提出的“函数式拥有的特性“。这仨语言的实现,抱歉看不下去。忍着读了,只觉得痛苦。
再到后来,提到了 lazy evaluation,我一直很好奇的一个特性,但是作者写的我根本没看懂。还提到了 “第三章 Scala 的模式匹配“,第三章压根没有啊,翻来覆去地看,我还以为自己眼睛瞎了,后来发现模式匹配还在这一节的后面——不知道这是作者还是译者、编辑、校对、印刷的锅?
模式匹配讲得很一般,我没看出来这里面将模式匹配与 switch 的对比,对比出来的结论里模式匹配和 switch 有啥区别。远不如我以前学 UW 的那个 PL 第一门教 SML 时模式匹配的说道。不过这一章的例子让我突然明白,树的精髓在于模式匹配和递归,这俩都是反命令式编程直觉的,所以对于命令式惯了的思维来说很难主动想到。
在第六章提到了设计模式被函数式编程替代的方面,论证得还算不错,不过提到的设计模式实在冷门,反正我没有学过(不常见)。而且这一章给谁看呢?喜欢函数式的人,都不会喜欢设计模式的。
第七章写 Java 8 的函数式改造,说实话,这一章还可以,至少我看得懂。没了。
第八章,我不懂 mixin,不想看三大语言,看不懂。只看懂了上下文抽象和复合型抽象对区别——这用你说?
总之,这本书没有提到 monad,对柯里化、缓求值、模式匹配都讲得很糙。几乎没有目标受众的一本书,不属于入门级也不属于深入级。但是鉴于第一章写得很好,给个三星还是可以的。
《函数式编程思维》读后感(四)
花了半天看完本书,总体来说,收获还是挺多的。通过阅读本书,可以对函数式编程有个系统的了解,当然仅仅是了解,要想深入,还是得在实际开发中多用函数式编程思维来解决问题。
这本书主要介绍了函数式编程的思想:通过减少不确定性因素来让代码容易理解和编写。然后从多个角度讨论了函数式编程思维的一些特点。
对于开发者而言,掌握函数式编程思维有如下好处:
1. 提高开发效率。函数式编程把很多低层次细节的控制权移交给运行时,从而消弭了一大堆注定会发生的程序错误
2. 复合型抽象。函数式编程以参数传递和函数的复合作为主要的表现手段,这跟面向对象方式偏耦合式不同
3. 多种编程范式。实际开发中经常需要使用多种编程范式,而函数式编程是绕不过去的
4. 提升思考层次。把时间花在更高层次的抽象上,多考虑怎么解决复杂的业务场景,少去费心底层的复杂运作
....
下面是书中摘录,想了解更多细节最好通读一遍本书。
1. 命令式编程在一定程度上牺牲了代码的清晰来换取性能,容易产生交织
2. 把时间花在更高层次的抽象上,多考虑怎么解决复杂的业务场景,少去费心底层的复杂运作
3. 函数式编程语言让我们用让高阶抽象从容取代基本的控制结构,就像 jvm 接管内存减轻了我们的负担
4. 把琐碎的细节交托给运行时,令繁冗的实现化作技巧
5. 面向对象编程与函数式编程的关键区别:面向对象编程通过**封装不确定因素**来使代码能被人理解,函数式编程通过**尽量减少不确定因素**来使代码能被人理解
6. 函数式语言提倡在有限的几种关键数据结构上运用针对这些数据结构高度优化过的操作,以此构成基本的运转机构。开发者再根据具体用途,插入自己的数据结构和高阶函数去调整机构的运转方式
1. 命令式编程是按照“程序是一系列改变状态的命令”来建模的一种编程风格
2. 学会用更高层次的抽象来思考有什么好处?首先,会促使我们换一种角度去归类问题,看到问题的共性;其次,让运行时有更大的余地去做智能的优化,有时候,在不改变最终输出的前提下,调整一个作业的先后次序会更有效率
3. 多着眼结果,少纠结步骤
4. Functional Java 可以在小于 java 8的版本中实现函数式编程风格的写法
5. 不要增加无谓的摩擦。高阶函数消除了摩擦
6. 具有普遍意义的基本构造单元:筛选,映射,折叠/化约。需要根据筛选条件来返回一个子集合时,用 filter;需要就地变换一个集合时,用 map;需要将集合分成一小块一小块来处理时,用 reduce 或 fold
7. 函数式编程以参数传递和函数的复合作为主要的表现手段,不会用很多抽象,但每个抽象的泛化程度都很高(特化的方面通过高阶函数注入)
8. 懂得什么时候应该使用像“reduce”这样的高层次抽象,是掌握函数式编程的一处关键所在
9. 抓住不同语言的共同点去观察,就很容易搞清楚这些不同语言的术语
1. 函数式思维的好处之一,是能够把低层次细节(如垃圾回收)的控制权移交给运行时,从而消弭了一大堆注定会发生的程序错误。
2. 抽象的目的,让开发者从繁琐的运作细节中解脱出来,去解答问题中非重复性的那些方面
3. 函数式语言中向语言和运行时让渡控制权的 5 种途径:
- 迭代让位与高阶函数
- 闭包。闭包表现出来的思维是“让运行时去管理状态”,还是推迟执行原则的绝佳样板
- 柯里化和函数的部分施用。可用于实现函数工厂、模板方法模式和隐含参数
- 递归
- stream和作业顺序重排
本章介绍了函数式语言的两种常见特性。
1. 记忆(memoization)。需确保被记忆的函数:没有副作用,不依赖任何外部信息。java 8 虽然没有提供记忆特性,但可借助lambda特性实现
2. 缓求值(laziness) 。好处:减少占用的存储空间,必要时才执行;可用它建立无限大的集合;缓求值集合有利于运行时产生更高效代码
1. 少量的数据结构搭配大量的操作
2. 让语言去迎合问题
3. 对分发机制(动态选择行为,条件语句)的再思考
4. 运算符重载
5. 函数式的数据结构。类型安全的错误处理范式 Either 类,Option 类
设计模式在函数式语言下的三种情况.
1. 模式被吸收成为语言的一部分。比如工厂、策略、单例和模板方法等
2. 模式保留了原来的语义,但实现发生了变化。Flyweight 模式基于记忆特性的实现
3. 函数式的语言和运行时的特性不同于其它编程范式,产生了新的解决方案。例如可以用元编程解决很多问题
这章主要讲解函数式思维在现实开发中的一些例子。
1. java 8 。函数式接口,Optional 类型,stream
2. 函数式的基础架构。
- 架构。不可变值
- CQRS。命令-查询职责隔离
- Web 框架
- 数据库 Datomic
1. 多种编程范式:面向对象,元编程,函数式,过程式...。范式之间存在正交情况,比如元编程与函数式
2. 多编程范式语言带来的范式混乱等现象,可以依靠工程纪律来保证项目所有开发者都朝着同一个方向努力
3. 上下文抽象与复合型抽象的对比。4GL 语言是上下文式设计思路的范本,但最终衰落;shell 命令的组合是复合型抽象的典型
4. 函数式金字塔
- Ola Bini 提出的多语言金字塔。从下到上是:静态语言,动态语言,DSL
- 作者对改进后称之为函数式金字塔。从下到上是:函数式,命令式,DSL