gpt4 book ai didi

scala - 异常(exception)和参照透明度

转载 作者:行者123 更新时间:2023-12-04 18:05:35 25 4
gpt4 key购买 nike

阅读“Scala 中的函数式编程”,我对异常不具有参照透明性的部分感到有些困惑。

给出的例子是

def failingFn(i: Int): Int = {
val y: Int = throw new Exception("fail!")
try {
val x = 42 + 5
x + y
}
catch { case e: Exception => 43 }
}

所以书中给出的论点是 y不是引用透明的,因为如果我们将它代入 try 中的正文中块我们得到的结果与直接运行函数不同。这对我来说没有任何意义,因为整个函数一开始都是非终止的,所以说函数体内的值不是引用透明的有什么意义?我心目中的天真替换如下
def failingFn(i: Int): Int = {
val y: Int = throw new Exception("fail!")
try {
val x = 42 + 5
x + ((throw new Exception("fail!")): Int)
}
catch { case e: Exception => 43 }
}

并且仍然以相同的异常(exception)失败。

此外, y本身是一个非值(它不能直接被评估为一个值)那么谈论这些表达式的引用透明有什么意义呢?我怀疑这里有某种花招,所以我的推理究竟在哪里不正确?

最佳答案

书中提出的观点是,如果它确实是引用透明的,那么您可以删除 y完全变量并将其替换在 try/catch 内你最终会得到不同的语义。

因此,重点是,在异常情况下,对异常的评估点很重要。

也许您会争辩说这两个程序在语义上并不相同,因为评估的位置在这里才是真正重要的。如果您制作 y lazy ,那么结果不会改变。

关于scala - 异常(exception)和参照透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28992625/

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