返回打破引用透明度?

res*_*man 12 functional-programming scala referential-transparency

我正在阅读Scala WartRemover工具的描述,并对其中的一个要点感到困惑.描述说:

return打破参考透明度.重构以安全的方式终止计算.

// Won't compile: return is disabled
def foo(n:Int): Int = return n + 1
def foo(ns: List[Int]): Any = ns.map(n => return n + 1)
Run Code Online (Sandbox Code Playgroud)

这对我来说没有任何意义,两个例子看起来都是透明的.是否有某种方式使return关键字使函数更有可能破坏引用透明度?我只是完全误解了他们的观点?

Dav*_*ith 3

从本质上讲,引用透明度是关于评估表达式。从根本上来说,它表示如果您在上下文中计算表达式,那么如果您在任何相同的上下文中计算它,它将计算出相同的值。

除了“return”语句根本不计算任何内容。它们导致封闭方法的当前调用计算结果。没有办法符合引用透明度的概念。“throw”语句也有类似的问题。

对于示例,第一个

def foo(n:Int): Int = return n + 1
Run Code Online (Sandbox Code Playgroud)

是良性的,但冗长且不惯用。第二个

def foo(ns: List[Int]): Any = ns.map(n => return n + 1)
Run Code Online (Sandbox Code Playgroud)

问题就多了。如果传递空列表,则返回空列表。如果传递一个非空列表,则返回列表头部的值加 1。

  • 为什么第二个有问题?`= if (ns.isEmpty) () else ns.head + 1` 在没有 `return` 的情况下具有相同的行为? (5认同)
  • 我同意这可能是一个错误。我想我错过了与破坏引用透明度的联系 (3认同)