函数式程序员喜欢用少数几个核心数据结构,围绕他们去建立一套充分优化的运转机构 而面向对象程序员喜欢不断创建新的数据结构和附属的操作,因为面向对象编程范式就是建立新的类和类间的消息
函数式编程的程序构造更方便我们在比较细小的层面重用代码
转变思维
- 学习一种新的范式 - 我们必须学会为熟悉的问题找到新的解答方法,换用函数式编程语言并不是写出函数是代码的必要条件,转变我们看问题的角度才是必不可少的
- 学会用更高层次的抽象来思考有什么好处? 首先,会促使我们换一种角度去归类问题,看到问题的共性;其次,让运行时有更大的余地去做智能的优化;第三,让埋头于实现细节的开发者看到原本视野之外的一些解决方案。
- 掌握新的构造单元之后,还要善于从问题里发现他们的身影,从而抓住解题的脉络。函数式编程不会用很多抽象,但每个抽象的泛化程度都很高(特化的方面通过高阶函数注入)。函数式编程以参数传递和函数的复合作为主要的表现手段。
责权让渡
- 迭代让位于高阶函数
理解掌握的抽象层次永远要比日常使用的抽象层次更深一层
- 闭包 - 实际上是一种特殊函数,他在暗地里绑定了函数内部引用的所有变量,换句话说,这种函数把他引用的所有东西都放在一个上下文里包了起来
闭包还是推迟执行原则的绝佳样板。我们把代码绑定到闭包之后,可以推迟到适当的时机再执行闭包
命令式语言围绕状态来建立编程模型,参数传递是其典型特征。
闭包作为一种对行为的建模手段,让我们把代码和上下文同时封装在单一结构也就是闭包本身里面,像传统数据结构一样可以传递到其它位置,然后再恰当的时间和地点完成执行 - 柯里化和函数的部分施用
- 用巧不用蛮
语言设计者实现出来的机制总比开发者自己做的效率更高,因为他们可以不受语言本身的限制
- 缓求值是函数式编程语言常见的一种特性,指尽可能地推迟求解表达式: 好处一: 昂贵的运算只有到了绝对必要的时候才执行 好处二: 我们可建力无限大的集合,接到请求就直接送出元素 好初三: 按缓求值的方式来使用映射、筛选等函数式概念,可以产生更高效的代码。
演化的语言
100个函数操作一种数据结构的组合,要好过10个函数操作10个数据结构的组合
模式与重用
如果我们的语言支持的编程范式以对象为本,我们就很容易不自觉地按照对象的术语来思考所有问题的答案。 不过,大多数现代语言都是多范式的,支持对象、元对象、函数式以及其它多样化的范式。 学会使用不同的范式来处理不同的问题,是开发者进步路上需要约过的一道坎。
《函数式编程思维》豆瓣链接