阅读“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 }
}
并且仍然失败,但有同样的例外。
此外,y
它本身是一个非值(它不能直接被评估为一个值),那么谈论这些表达式的引用透明性有什么意义呢?我怀疑这里有某种花招,所以我的推理到底在哪里不正确?