纯函数 - 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
  1. 它修改了函数本体以外的值 state, 它拥有这个附加作用
  2. 当你调用 increaseA 这个函数时,存在着不确定性,你无法保证调用后 state 是多少

如果函数有以下任意一种作用,它也不是纯函数:

  • 发起网络请求
  • 刷新 UI
  • 读写数据库
  • 获取位置信息
  • 使用蓝牙模块
  • 打印输出
  • ...

这些作用称为函数的附加作用(副作用)

纯函数的定义就是:没有附加作用的函数,并且在参数相同时,返回值也一定相同

所以 increaseA 不是纯函数

⚠️ **GitHub.com Fallback** ⚠️