把计算分成可组合的函数

函数式编程将问题拆成输入到输出的变换,再把这些变换组合起来。函数可以作为值被保存、传递和返回,高阶函数则接收函数或产生函数。例如同一套遍历逻辑可以接收不同处理规则,分别完成数值转换或文本整理,不必为每种元素操作重新写遍历过程。

参考:[1] [2]

把状态变化放到可见位置

纯函数的结果只依赖输入,不在计算之外留下状态修改。这让相同输入的行为较容易推理,但真实程序仍需要读取文件、显示结果和接收用户操作。实践中常把主要计算写成纯函数,把这些外部交互集中处理;使用函数式风格并不意味着整个程序完全没有副作用。

参考:[1]

不原地改写的数据

不可变数据建立之后不能就地修改,更新操作产生一个新的逻辑值,而旧值仍可供其他计算使用。Clojure把不可变数据与一等函数结合起来,但并不强制程序处处保持纯粹。这样的设计让计算步骤能够明确说明自己使用哪个值,避免悄悄改动另一个步骤正在读取的数据。

参考:[2]

组合不等于忽略执行成本

映射、筛选和折叠等操作分别表达逐项变换、选择元素和累积结果,能够连接成数据处理过程。不过,中间集合、惰性求值和递归的实际成本仍由语言与实现决定。函数式程序也要管理资源与性能,只是把计算关系表达为可组合的函数,而不是主要依赖共享变量的连续修改。

参考:[1] [2]