12

我正在阅读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使函数更有可能破坏引用透明度?我只是完全误解了他们的观点吗?

4

1 回答 1

3

在其核心,引用透明度是关于评估表达式。从根本上说,如果您在上下文中评估一个表达式,如果您在任何相同的上下文中评估它,它将评估为相同的值。

除了“return”语句根本不评估任何东西。它们导致封闭方法的当前调用评估为某些东西。没有办法符合引用透明度的概念。“throw”语句也有类似的问题。

对于示例,第一个

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

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

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

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

于 2015-01-06T14:25:34.583 回答