gpt4 book ai didi

functional-programming - 为什么引发异常是副作用?

转载 作者:行者123 更新时间:2023-12-03 06:38:53 25 4
gpt4 key购买 nike

根据维基百科条目 side effect ,引发异常会产生副作用。考虑这个简单的 python 函数:

def foo(arg):
if not arg:
raise ValueError('arg cannot be None')
else:
return 10

使用foo(None)调用它总是会遇到异常。相同的输入,相同的输出。它是参照透明的。为什么这不是一个纯函数?

最佳答案

只有当您观察到异常并根据异常做出改变控制流的决定时,才会违反纯度。实际上抛出异常值是引用透明的——它在语义上等同于非终止或其他所谓的 bottom values.

如果(纯)函数不是 total ,然后计算出底部值。如何对底部值进行编码取决于实现 - 它可能是一个异常(exception);或非终止,或除以零,或其他一些失败。

考虑纯函数:

 f :: Int -> Int
f 0 = 1
f 1 = 2

这并未针对所有输入进行定义。对于某些人来说,它的评估结果是底部。实现通过抛出异常对其进行编码。它在语义上应该等同于使用 MaybeOption 类型。

现在,只有当您观察底部值并根据它做出决策时,您才会打破引用透明度 - 这可能会引入非确定性,因为可能会抛出许多不同的异常,而您可以'不知道是哪一个。因此,出于这个原因,捕获异常是在 Haskell 的 IO monad 中,同时生成所谓的 "imprecise" exceptions纯粹可以做到。

因此,提出异常本身就是一种副作用是不正确的。问题在于您是否可以根据异常值修改纯函数的行为,从而破坏引用透明度。

关于functional-programming - 为什么引发异常是副作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10703232/

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