纯函数

什么是纯函数?

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

下面我们给出两个函数 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 等等。

什么是函数的附加作用?

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容

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