功能编程:副作用

时间:2011-03-21 18:23:52

标签: functional-programming

大多数教程/文章/书籍在介绍函数式编程时都会讨论副作用。拿这个Python代码:

def isPrime(n):
    k = 2
    while k < n:
        if n % k == 0:
            return False
        k += 1
    return True

文中说上面的功能有局部副作用,我不明白。我看到变量“k”正在发生变化,我不明白它有什么不好。

有人可以举一个明显的不良副作用的例子,以及如何通过函数式编程来避免它?

2 个答案:

答案 0 :(得分:16)

您所指的文字是正确的,更改本地变量被视为副作用。

这并不是说这是一件坏事。它不是函数式编程。在纯函数式编程语言中,您将以递归方式编写循环,从而无需更改变量。

编写像这样的函数(没有可观察到的副作用)在任何语言中都是很好的练习,它不是函数式编程。

编辑:现在我看到你关于“坏”副作用的评论。我不会说副作用很糟糕。在大多数主流语言中,没有它们很难编程,我认为很多程序员都会考虑副作用。但是在大型软件项目中,过分依赖副作用可能会让你的生活变得非常悲惨。 Here's a nice example involving singletons (the ultimate way to cause side effects)

在一种禁止副作用的语言中,作为程序员,您和编译器的惊喜都会少一些。纯函数代码更容易分析和并行化,并且至少在理论上,编译器更容易优化。

答案 1 :(得分:3)

副作用(特别是没有引用透明度)构成result of your code depend on the order of execution of the statements。因此,更改调用某些函数调用的顺序可能会改变程序的断开连接区域中的行为。这是因为由于副作用的相互共享,它们并没有真正断开连接。

这使得程序的分解难以令人难以置信,从而使用新代码编写现有代码或以其他方式隔离和分离代码任何部分的功能令人沮丧。换句话说,副作用就像Rigor Mortis胶水一样溢出所有东西并使其成为一种难以穿透的整体意大利面条。尝试拔出一条面条,不会对大多数其他面条造成一连串的干扰。