阅读“ 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
它本身是一个非值(不能直接评估为一个值),那么谈论此类表达式的引用透明性有什么意义呢?我怀疑这里手忙脚乱,所以我的推理到底在哪里不正确?
本书指出的是,如果它确实是参照透明的,则可以y
完全删除该变量并将其替换为,try/catch
从而得到不同的语义。
因此,要指出的是,在例外情况下,评估例外情况很重要。
也许您可以争辩说这两个程序在语义上是不同的,因为评估的位置才是真正重要的。如果选择y
lazy
,则结果不会改变。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句