gpt4 book ai didi

haskell - bool 表达式和副作用

转载 作者:行者123 更新时间:2023-12-04 00:56:13 24 4
gpt4 key购买 nike

希望大家都平安。

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

谢谢!

最佳答案

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

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

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

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

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

如果您当然指定它们返回TrueFalse,因此没有任何副作用,那么一个 bool 值表达式没有副作用,因为 notandor 等通常也没有副作用。但问题在于,您无法根据返回类型判断函数在 Python(和其他命令式语言)中是否具有副作用。

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

此外,它还可以更轻松地并行运行事物,因为同样,没有副作用的函数不会影响另一个函数的结果,因此这两个函数可以由不同的核心进行评估。

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

关于haskell - bool 表达式和副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62373128/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com