Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell boolen表达与副作用_Haskell_Boolean Expression_Side Effects - Fatal编程技术网

Haskell boolen表达与副作用

Haskell boolen表达与副作用,haskell,boolean-expression,side-effects,Haskell,Boolean Expression,Side Effects,我希望每个人都安全 我正在学习Haskell,发现Haskell中的函数没有副作用。我只是想知道在命令式语言中,布尔表达式被认为是没有副作用的表达式,因为它们只返回true或false(它们的主要作用) 谢谢 在命令式语言中,表达式通常会有副作用。例如,在Python中: def f(x): print(x) return True if f(2) or f(4): print(3) def(x): 打印(x) 返回真值 如果f(2)或f(4): 打印(3) 因此,它在

我希望每个人都安全

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


谢谢

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

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

if f(2) or f(4):
    print(3)
def(x):
打印(x)
返回真值
如果f(2)或f(4):
打印(3)
因此,它在这里打印到标准输出通道,这是一个副作用。它还可以执行文件I/O、在数据库中插入记录、执行网络I/O、在列表中插入元素、创建进程以及其他形式的副作用

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

当然,如果您指定它们只返回
True
False
,因此没有任何副作用,那么布尔表达式没有副作用,因为
not
等通常也没有副作用。但问题是,不能根据返回类型判断函数在Python(和其他命令式语言)中是否有副作用

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

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


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

某个函数可能会产生副作用,例如,如果调用一个函数写入文件,在数据库中插入一条记录,因此,基本上这与表达式无关,而与确定哪些表达式有副作用,哪些没有副作用的编程语言规则有关。为什么Haskell或其他函数式编程语言不允许(基本上)任何副作用?它们在创造肤色和抽象方面不是很有用吗?@ZeevKeane:没有任何副作用是很有用的。例如,这意味着Haskell可以实现“自动”惰性编程:因此,程序员不必指定什么可以惰性地完成,编译器可以这样做,因为不管是否对其他函数的结果进行了计算。@ZeevKeane:更新了一些无副作用函数的优点。特别是在JavaScript中,最近有一些有趣的功能性编程,以避免与这些副作用有关的bug。例如,请参见:@ZeevKeane Yes,通过类型系统记录/强制执行纯度意味着您不必依靠惯例/最佳实践/您的同事来做正确的事情。它允许你对其他代码的行为做出更安全的假设,而无需阅读,从而减少了你的认知负荷。@ZeevKeane一种可能的理解方式是:Haskell并不真的禁止副作用,我们总是可以返回
IO Bool
,并假装必须这样做。除此之外,Haskell还允许使用一种保证没有副作用的类型,即
Bool
。这样看来,命令式语言只有
iobool
,而在Haskell中,我们可以在两者之间进行选择。有人甚至会说,正因为如此,Haskell给了我们更多的灵活性,而命令式语言限制程序员只使用
IO Bool
,即使是纯函数。这是一种延伸,但从技术上讲是正确的。