Answers
副作用是函数式编程语言的一个说法,指的是破坏函数的“纯函数性”(或者说“无副作用性”)而言的。
首先解释一下什么叫纯函数,纯函数就是指给定相同输入就一定会有相同输出的函数。从实现上来说这样的函数没有为自己保留生命周期超过自身调用的上下文,例如C语言里函数中的static变量的生命周期就会比函数调用要长。比如像
sin()
、
cos()
这样的函数就是纯函数的,给定相同的输入就一定会有相同的输出。
当然还有一类函数自身具有一定的状态,导致即便你给定相同的输入,也不一定会给出相同的输出。比如常见的随机函数
rand()
就是这一类。这一类函数内部保存的状态破坏了其函数的“纯度”,所以就被称为具有副作用。
纯函数和带有副作用的函数并非是不可转换的,只要将非纯函数的状态提取成一个context并在调用时传给函数,就能将函数改造为纯函数,比如同是随机函数的
rand_r()
就是个纯函数。
之所以提倡编写纯函数尽量避免副作用,是因为具有副作用的函数的状态其实类似于一个单例(无论多少次被调用,访问的都是同一个上下文),从而给函数的并发带来麻烦。除开并发上的缺点,带有副作用的函数也通常没有纯函数好调试。
弄爆你的菊
answered 9 years, 4 months ago