函数式编程基础之纯函数

Posted Web手艺人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数式编程基础之纯函数相关的知识,希望对你有一定的参考价值。

最近函数式编程被提到的越来越多,你一定或多或少听说过,但由于无论是思想上还是编写方式上,函数式编程都与面向对象等主流编程方式差距较大,再加上目前实际工作中很少有项目使用函数式编程,这导致了许多小伙伴和我一样,仅仅听说过函数式编程,并不真正了解。

完整的学习函数式编程是一件系统的事情,一篇文章讲不清楚,所以我们先从一个点开始,希望能为你学习函数式编程打下一点基础。

所以,今天的关键词是:纯函数。


什么是纯函数

纯函数是函数式编程中非常重要的一个概念,首先我们给纯函数一个定义,简单的说,满足下面条件的函数,我们称之为纯函数


相同的输入,永远会得到相同的输出,不依赖于作用域外的任何状态,且不对系统产生任何副作用


下面我们通过两个例子来理解一下这个定义 


例子1:


从上面的例子可以看出,slice函数对于相同的输入可以确保产生相同的输出,因此其符合我们对纯函数的定义,而splice函数则明显产生了副作用,因为它永久性的改变了数组,因此splice不是纯函数。

例子2:

函数式编程基础之纯函数

这个例子中,impureAdd函数和pureAdd函数看起来都能确保相同的输入产生相同的输出,但其实impureAdd函数并不纯,因为它计算中用到的变量b并不在函数内部,当程序变得比较复杂时,我们无法保证变量b一直是稳定的,因此对照纯函数的定义,我们认为impureAdd函数依赖于作用域外的状态,不是纯函数。

到这里,我们基本理解了什么样的函数是纯函数,而基于对纯函数的理解,我们可以总结出纯函数的如下特点


纯函数可以表示不同数值之间的特殊对应关系


函数式编程基础之纯函数

函数式编程基础之纯函数


从上面的关系图中可以看出,只有纯函数才能表示稳定的对应关系,而普通的函数,由于相同的输入可能产生不同的输出,因此并不能表示这种关系。另外,需要注意的是,在纯函数表示的对应关系中,不同的输入有可能产生相同的输出。

纯函数的作用

在我们了解了纯函数和它的特点后,来看一下纯函数的这种特点能够有什么作用

缓存

基于纯函数可表示数值之间对应关系的特性,我们可以实现缓存,因为在纯函数中,相同的输入总能产生相同的输出,因此只要我们对输入输出值进行关系记录,当再次输入相同的值时,就无需再执行函数内部的逻辑和计算,可以直接输出结果。例子如下:

方便移植

纯函数完全不依赖于外部的任何状态,函数执行需要的东西,要么通过参数传入,要么存在于函数内部,因此完全是自给自足的,如此一来,纯函数就可以非常方便的移植到程序的其他地方使用,或者是移植到不同的程序中使用,无需担心移植后的函数会出现问题,下面我们看一个例子:


方便调试与测试

这一点非常容易理解,当我们开发程序过程中出现问题时,我们只需要关心函数的输入输出及内部逻辑,而不需要关心是否程序的其他地方产生了影响。同样的,纯函数也让测试变得更加容易,因为在测试时我们不再需要去模拟复杂的环境,只需要给对应函数一个输入,然后断言其输出就可以了,如此一来可以极大地降低测试的难度,也可以更方便的编写测试脚本。

总结

以上我们了解了什么是纯函数,也基于它数值对应的特点,介绍了3种纯函数的优势,其实纯函数还有一些其他特点和优势,大家有兴趣可以继续学习。在整个函数式编程的过程中,纯函数是非常重要的基础之一,希望本文能够让你搞懂纯函数,为你学习函数式编程打下一点基础。



以上是关于函数式编程基础之纯函数的主要内容,如果未能解决你的问题,请参考以下文章

python基础-函数式编程

Scala 基础:Scala 函数式编程基础概念定义调用机制

JavaScript函数式编程基础

js函数式编程基础:高阶函数柯理化函数合成Loadash

Scala学习(函数式编程面向对象编程)

Scala学习(函数式编程面向对象编程)