函数的副作用 —— 纯函数的理解

函数副作用指当调用函数时,除了返回函数值之外,还对主调用函数产生附加的影响。例如修改全局变量(函数外的变量)或修改参数。

纯函数

纯函数(Pure Function)——输入输出数据流全是显式(Explicit)的。

显式的意思是,函数与外界交换数据只有一个唯一渠道——参数和返回值;函数从函数外部接受的所有输入信息都通过参数传递到该函数内部;函数输出到函数外部的所有信息都通过返回值传递到该函数外部。

非纯函数

如果一个函数通过隐式(Implicit)方式,从外界获取数据,或者向外部输出数据,那么,该函数就不是纯函数,叫作非纯函数(Impure Function)。

隐式的意思是,函数通过参数和返回值以外的渠道,和外界进行数据交换。比如,读取全局变量,修改全局变量,都叫作以隐式的方式和外界进行数据交换;比如,利用 I/O API(输入输出系统函数库)读取配置文件,或者输出到文件,打印到屏幕,都叫做隐式的方式和外界进行数据交换。

引用透明

引用透明(Referential Transparent)的概念与函数的副作用相关,且受其影响。如果程序中任意两处具有相同输入值的函数调用能够互相置换,而不影响程序的动作,那么该程序就具有引用透明性。它的优点是比非引用透明的语言的语义更容易理解,不那么晦涩。纯函数式语言没有变量,所以它们都具有引用透明性。

特殊的函数副作用

上述只讨论了一般的情况,还有一种特殊的情况,我们没有讨论。有些函数的参数是一种 In/Out 作用的参数,即函数可能改变参数里面的内容,把一些信息通过输入参数,夹带到外界。这种情况,严格来说,也是副作用。也是非纯函数。 比如下面的函数。

 process(context) {
   a = context.getInfo()
   result = calculate(a)
   context.setResult(result)
 }

纯函数的好处主要有几点:

  • 无状态。线程安全。不需要线程同步。
  • 纯函数相互调用组装起来的函数,还是纯函数
  • 应用程序或者运行环境(Runtime)可以对纯函数的运算结果进行缓存,运算加快速度。

233

猜你喜欢

转载自www.cnblogs.com/lemos/p/10921255.html