纯函数 - ShenYj/ShenYj.github.io GitHub Wiki
在程序设计中,若一个函数符合以下要求,则它可能被认为是纯函数:
-
此函数在相同的输入值时,需产生相同的输出。函数的输出和输入值以外的其他隐藏信息或状态无关,也和由I/O设备产生的外部输出无关
-
该函数不能有语义上可观察的函数副作用,诸如“触发事件”,使输出设备输出,或更改输出值以外物件的内容等。 纯函数的输出可以不用和所有的输入值有关,甚至可以和所有的输入值都无关。但纯函数的输出不能和输入值以外的任何资讯有关。纯函数可以传回多个输出值,但上述的原则需针对所有输出值都要成立。若引数是传引用调用,若有对参数物件的更改,就会影响函数以外物件的内容,因此就不是纯函数。
以上文字摘自维基百科 纯函数
在学习 RxSwift 前我觉得优先要了解下什么是纯函数,我想这也是为何 RxSwift 中文手册中将这部分的介绍放在了 食谱
中
函数式编程中最重要的两个概念:
RxSwift 中文手册中的介绍 文中的两段示例代码很好的解释了什么是纯函数
-
纯函数
var state = 0 func increaseB(state: Int) -> Int { return state + 1 } let state = increaseB(state: 0) print(state) // 结果: 1
-
非纯函数
var state = 0 func increaseA() { state += 1 } increaseA() print(state) // 结果: 1
- 它修改了函数本体以外的值
state
, 它拥有这个附加作用 - 当你调用
increaseA
这个函数时,存在着不确定性,你无法保证调用后state
是多少
如果函数有以下任意一种作用,它也不是纯函数:
- 发起网络请求
- 刷新 UI
- 读写数据库
- 获取位置信息
- 使用蓝牙模块
- 打印输出
- ...
这些作用称为函数的附加作用(副作用)
而纯函数
的定义就是:没有附加作用的函数,并且在参数相同时,返回值也一定相同
所以
increaseA
不是纯函数