返回是否破坏引用透明度



我正在阅读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)

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

引用透明度的核心是评估表达式。 从根本上说,它说如果你在一个上下文中计算一个表达式,如果你在任何相同的上下文中计算它,它就会计算到相同的值。

除了"返回"语句根本不计算任何内容。 它们会导致封闭方法的当前调用计算为某物。 没有办法符合引用透明度的概念。 "抛出"语句也有类似的问题。

对于示例,第一个

def foo(n:Int): Int = return n + 1

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

def foo(ns: List[Int]): Any = ns.map(n => return n + 1)

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

最新更新