纯函数
纯函数(pure function)是函数式编程的核心概念:输出只由输入决定、且不产生可观察副作用的一类函数。它与数学中的映射一一对应——映射本就要求全域性与唯一性(相同输入必有相同输出),纯函数正是把这两条数学要求原样移植到程序设计中,是"可计算即数学对象"这一思想的具体化。
需先掌握函数(定义域、对应法则、值域)与映射(全域性、唯一性),理解"确定性对应关系"这一核心前提。
定义
称函数 为纯函数,当且仅当它同时满足:
- 确定性(deterministic):对相同的输入 ,总返回相同的输出 ,不依赖时间、随机数或调用时的外部状态
- 无副作用(no side effects):执行过程不修改外部状态——不改全局变量、不做输入输出(I/O)、不改变传入参数,只通过返回值与外界通信
性质
- 引用透明(referential transparency):表达式的值不随上下文改变,可在程序中用其值原地替换而不改变程序行为,是纯函数最本质的推论
- 可缓存:由确定性,相同输入的结果可记忆化(memoization),以查表代替重复计算
- 可并行与可重排:无共享可变状态,调用顺序与并行执行互不干扰,天然适合多线程与分布式计算
- 可组合:纯函数复合后仍是纯函数,复杂程序可由小的纯函数拼装而成(管道式组合)
- 易于测试与推理:无需构造运行环境,给定输入即可断言输出,支持等式推理与形式化验证
示例
- 是纯函数:相同输入恒得相同输出,无副作用
- 不是纯函数:输出依赖随机数,不满足确定性
- 打印到控制台、改写全局计数器、读取当前时间的函数都不是纯函数(含副作用)
- 数学中的映射本身就是纯函数: 对每个 唯一确定 (见映射的定义公理);可逆情形即逆映射
应用
- 函数式编程:Haskell、Elm 等语言以纯函数为唯一构件,副作用用 Monad 等结构显式隔离
- 并行与大数据:MapReduce、Spark 的算子要求纯函数性质,任务可分片并行且可重放
- 缓存与记忆化:动态规划、React 的
useMemo等依赖"确定性"保证缓存正确 - 形式化验证与程序语义:引用透明使程序可用等式推理证明正确性,也是关系代数中函数可计算性的基础