布尔表达式和副作用

boolen expression and side effects

希望大家都平安。

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

谢谢!

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

def f(x):
    <b>print(x)</b>
    return True

if f(2) or f(4):
    print(3)

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

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

如果您当然指定它们returnTrueFalse,因此没有任何副作用,那么布尔表达式没有副作用,因为 notandor 等通常也没有副作用。但问题是你不能说一个函数在 Python (和其他命令式语言)中是否有副作用基于 return 类型。

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

此外,它更容易并行 运行 事情,因为没有副作用的函数不会对另一个函数的结果产生影响,因此这两个函数可以通过以下方式评估不同的内核。

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