纯函数

什么是纯函数?

在函数式编程里我们会经常谈到这两个概念。一个是 纯函数。另一个是 附加作用。这里我们就结合实际来介绍一下 纯函数 和 附加作用。

下面我们给出两个函数 increaseAincreaseB,他们其中一个是 纯函数,另一个不是 纯函数:

var state = 0

func increaseA() {
    state += 1
}

increaseA()

print(state) // 结果: 1


func increaseB(state: Int) -> Int {
    return state + 1
}

let state = increaseB(state: 0)

print(state) // 结果: 1

他们的作用差不多,使 state + 1, 我们可以猜测一下 increaseAincreaseB 哪一个是 纯函数

...
...
...
... 经过 10 秒后

现在公布答案:increaseB 是 纯函数,increaseA 不是 纯函数

为什么 increaseB 是 纯函数

因为他特别 纯洁:除了用入参 state 计算返回值以外没做任何其他的事情。

那为什么 increaseA 不是 纯函数

因为他修改了函数本体以外的值 state, 他拥有这个 附加作用,因此他 并不纯洁 就不是 纯函数

我们再来做以下两个测试,然后猜测他们能不能测试成功:


func testIncreaseA() {
    increaseA()
    state == 1 // 结果:?? 🤔
}


func testIncreaseB() {
    let state = increaseB(state: 0)
    state == 1 // 结果:true 😎
}

...

...

...

... 经过 20 秒后

嗯... 这里我们可以肯定第二个测试 testIncreaseB 会成功。0 + 1 肯定等于 1。那第一个测试呢?这可不好说了,我们并不知道 increaseA 是在什么环境下被调用的,不知道在这个环境下初始 state 是多少。如果他是 0 那测试就会成功的,如果他不是 0 那测试就会失败的。因此在不知道所处环境时,我们无法判断测试是否会成功。

由于 increaseA 存在修改外部 state 的 附加作用 所以他不是 纯函数。事实上如果函数有以下任意一种作用,他也不是纯函数:

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

我们将这些作用称为函数的 附加作用(副作用)。

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

因此在已知执行逻辑时,纯函数 所产生的结果是可以被预测的。一些现代化的库都利用了这个特性来做状态管理,如:RxFeedbackReduxReactorKit 等等。

什么是函数的附加作用?

如果一个函数除了计算返回值以外,还有其他可观测作用,我们就称这个函数拥有 附加作用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 我们所处的是一个命令式编程(imperative programming)的时代,这也是我们为何更喜欢用命令式风格...
    liuchengxu阅读 1,308评论 0 3
  • 什么是纯函数 纯函数是函数式编程中非常重要的一个概念,简单来说,就是一个函数的返回结果只依赖于它的参数,并且在执行...
    小泡_08f5阅读 430评论 0 0
  • 在本文中,将展示编写Ruby函数式代码的一种绝佳的方式。这种方式将使我们摆脱摆脱奇怪通顺的代码,编写非比寻常的纯函...
    falm阅读 825评论 0 1
  • 定义 简单来说,一个函数的返回结果只依赖于它的参数,并且在执行过程里面没有副作用,我们就把这个函数叫做纯函数。这么...
    kangaroo_v阅读 210评论 0 1
  • 运营基础职能四大模块:内容运营、用户运营、活动运营和产品运营。 一. 内容运营:围绕内容生产和消费搭建起来一个良性...
    李宗员阅读 237评论 0 0