【函数式】纯函数与替代模型

纯函数

一个函数在程序执行的过程中除了根据输入参数给出运算结果之外没有其他的副作用影响,我们可以把这类函数称为“纯函数”。纯函数由于不依赖外部变量,使得给定函数输入其返回结果永远不变,比如整数的加法函数,它接收两个整数值并返回一个整数值,对于给定的两个整数值,它的返回值永远是相同的整数值。

副作用

相对于非纯函数,它们带有副作用,这使得函数不仅简单返回一个值,还做了其他事情:

  • 修改了一个变量
  • 直接修改了数据结构
  • 设置了一个对象的成员
  • 抛出一个异常或以一个错误终止
  • 打印到终端或读取用户的输入
  • 读取或写入一个文件
  • 在屏幕上绘画

像是执行IO、处理错误、修改数据都属于副作用,这些副作用可能导致我们编写的程序难以测试,进而容易产生bug。遵循函数式编程规范可以使编程更加模块化,由于纯函数模块化的特性,使得程序容易被测试、复用、并行化、泛化以及推导,这也减少了产生bug的可能。

纯函数的使用将数据的创建过程和处理过程分离,通过把副作用推导程序的外层,来转换任何带有副作用的函数。对于函数式程序员而言,程序的实现应该有一个纯的内核和一层很薄的外围来处理副作用。

引用透明

引用透明(referential transparency)的概念对纯函数进行形式化,符合引用透明的表达式都可以由它的结果所取代,而不改变该程序的含义。当调用一个函数时所传入的参数是引用透明的,冰鞋函数调用也是引用透明的,那么这个函数式一个纯函数。当传入函数的参数也是一个纯函数时,使得高阶函数的组合也是引用透明的,这有利于构建更加复杂的逻辑,而本身程序的计算结果是可以进行推断的,不用担心环境对程序的影响。

对于程序p,如果它包含的表达式e满足引用透明,所有的e都可以替换为它的运算结果而不会改变程序p的含义。假设存在一个函数f,若变大时f(x)对所有引用透明的表达式x也是引用透明的,那么这个f是一个纯函数。

替代模型

引用透明要求函数不论进行了任何操作都可以用它的返回值来代替。这种限制使得推导一个程序的求值变得简单而自然,称之为替代模型(substitution model)。如果表达式是引用透明的,可以想象计算过程就像在解代数方程。展开表达式的每一部分,使用指示对象替代变量,然后归约到最简单的形式。在这一过程中,每项都被等价值所替代,计算的过程就是一个又一个等价值所替代的过程。换句话说,引用透明使得程序具备了等式推理的能力。

替代模型更容易推理,因为对运算的影响纯粹是局部的(只对那些赋值表达式产生影响),不需要先在内心模拟一系列状态的更新才理解这一段代码。只需要理解局部的推理,不必费心地去跟踪函数执行前后的状态变化,只用简单看一下函数的定义,把它替换成一个参数。

小结

这一小节,我们了解了纯函数的一些基本概念和其带来的好处。我们知道,纯函数时模块化的、可组合的,因为它从“对结果做什么”和“如果获取输入”中分离了计算本身的逻辑,就像一个黑盒子。对输入的获取只有一种方式:通过参数传给函数。输出也只是简单地将计算结果返回。把这些关注点分离开,计算也更容易被复用。我们可以复用这些逻辑,而不必担心输入或输出对整个上下文引起的副作用。

转载请注明作者Jason Ding及其出处
jasonding.top
Github博客主页(http://blog.jasonding.top/)
CSDN博客(http://blog.csdn.net/jasonding1354)
简书主页(http://www.jianshu.com/users/2bd9b48f6ea8/latest_articles)
Google搜索jasonding1354进入我的博客主页

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

推荐阅读更多精彩内容