布尔表达式和副作用

Zee*_*ane 3 haskell side-effects boolean-expression

我希望每个人都安全。

我正在学习 Haskell,并发现 Haskell 中的函数没有副作用。我只是想知道在命令式语言中布尔表达式被认为是没有副作用的表达式,因为它们只返回 true 或 false(它们的主要效果)

谢谢!

Wil*_*sem 6

在命令式语言中,表达式通常会产生副作用。例如在 Python 中:

def f(x):
    print(x)
    return True

if f(2) or f(4):
    print(3)
Run Code Online (Sandbox Code Playgroud)

因此,它在这里打印到标准输出通道,这是一个副作用。它还可以执行文件 I/O、在数据库中插入记录、执行网络 I/O、在列表中插入元素、创建进程和其他形式的副作用。

无论表达式的类型如何,它通常都会产生副作用。在安全的Haskell 中,通常不能执行任何 I/O,除非您使用IO,因此它是IO Bool,而不是Bool。此外,所有变量都是不可变的,因此您不能将元素添加到列表中,您可以构建一个新列表,但是对“旧”列表的读者没有影响。

如果你的课程指定他们返回True或者False,因而没有任何副作用,那么布尔表达式没有副作用,因为notandor,等通常没有副作用无论是。但问题是你不能根据返回类型判断一个函数在 Python(和其他命令式语言)中是否有副作用。

函数没有副作用的想法使编译器可以进行许多优化。例如在 Haskell 中,所有东西都是惰性求值的,这意味着除非你需要知道某物的值,否则它不会被求值。这是可能的,因为评估没有副作用的函数的顺序并不重要。如果一个函数不能改变另一个函数可以访问的列表,那么它就不会对该列表的结果产生影响。

此外,它还使并行运行更容易,因为同样,一个没有副作用的函数不会影响另一个函数的结果,因此这两个函数可以由不同的内核评估。

但也许最有用的结果是它使程序非常模块化,并且不易出错。许多错误是由于函数对对象、数据库等进行更改而导致程序中的函数没有预料到这些更改。例如,如果一个函数从数据库中删除了一条记录,那么下一个函数可能会在这条记录仍然存在的假设下工作。

  • @ZeevKeane是的,类型系统指出/强制执行的纯度意味着您不必依赖约定/最佳实践/您的同事来做正确的事情。它允许您对其他代码的行为做出更安全的假设,而无需阅读它,从而减轻您的认知负担。 (4认同)