函数式编程基础之纯函数
Posted Web手艺人
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数式编程基础之纯函数相关的知识,希望对你有一定的参考价值。
最近函数式编程被提到的越来越多,你一定或多或少听说过,但由于无论是思想上还是编写方式上,函数式编程都与面向对象等主流编程方式差距较大,再加上目前实际工作中很少有项目使用函数式编程,这导致了许多小伙伴和我一样,仅仅听说过函数式编程,并不真正了解。
完整的学习函数式编程是一件系统的事情,一篇文章讲不清楚,所以我们先从一个点开始,希望能为你学习函数式编程打下一点基础。
所以,今天的关键词是:纯函数。
什么是纯函数
纯函数是函数式编程中非常重要的一个概念,首先我们给纯函数一个定义,简单的说,满足下面条件的函数,我们称之为纯函数
相同的输入,永远会得到相同的输出,不依赖于作用域外的任何状态,且不对系统产生任何副作用
下面我们通过两个例子来理解一下这个定义
例子1:
从上面的例子可以看出,slice函数对于相同的输入可以确保产生相同的输出,因此其符合我们对纯函数的定义,而splice函数则明显产生了副作用,因为它永久性的改变了数组,因此splice不是纯函数。
例子2:
这个例子中,impureAdd函数和pureAdd函数看起来都能确保相同的输入产生相同的输出,但其实impureAdd函数并不纯,因为它计算中用到的变量b并不在函数内部,当程序变得比较复杂时,我们无法保证变量b一直是稳定的,因此对照纯函数的定义,我们认为impureAdd函数依赖于作用域外的状态,不是纯函数。
到这里,我们基本理解了什么样的函数是纯函数,而基于对纯函数的理解,我们可以总结出纯函数的如下特点
纯函数可以表示不同数值之间的特殊对应关系
从上面的关系图中可以看出,只有纯函数才能表示稳定的对应关系,而普通的函数,由于相同的输入可能产生不同的输出,因此并不能表示这种关系。另外,需要注意的是,在纯函数表示的对应关系中,不同的输入有可能产生相同的输出。
纯函数的作用
在我们了解了纯函数和它的特点后,来看一下纯函数的这种特点能够有什么作用
缓存
基于纯函数可表示数值之间对应关系的特性,我们可以实现缓存,因为在纯函数中,相同的输入总能产生相同的输出,因此只要我们对输入输出值进行关系记录,当再次输入相同的值时,就无需再执行函数内部的逻辑和计算,可以直接输出结果。例子如下:
方便移植
纯函数完全不依赖于外部的任何状态,函数执行需要的东西,要么通过参数传入,要么存在于函数内部,因此完全是自给自足的,如此一来,纯函数就可以非常方便的移植到程序的其他地方使用,或者是移植到不同的程序中使用,无需担心移植后的函数会出现问题,下面我们看一个例子:
方便调试与测试
这一点非常容易理解,当我们开发程序过程中出现问题时,我们只需要关心函数的输入输出及内部逻辑,而不需要关心是否程序的其他地方产生了影响。同样的,纯函数也让测试变得更加容易,因为在测试时我们不再需要去模拟复杂的环境,只需要给对应函数一个输入,然后断言其输出就可以了,如此一来可以极大地降低测试的难度,也可以更方便的编写测试脚本。
总结
以上我们了解了什么是纯函数,也基于它数值对应的特点,介绍了3种纯函数的优势,其实纯函数还有一些其他特点和优势,大家有兴趣可以继续学习。在整个函数式编程的过程中,纯函数是非常重要的基础之一,希望本文能够让你搞懂纯函数,为你学习函数式编程打下一点基础。
以上是关于函数式编程基础之纯函数的主要内容,如果未能解决你的问题,请参考以下文章