返回打破引用透明度?

时间:2015-01-06 14:08:30

标签: scala functional-programming 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)

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

1 个答案:

答案 0 :(得分:3)

在它的核心,参考透明度是关于评估表达式。从根本上说,它表示如果在上下文中计算表达式,如果在任何相同的上下文中对其进行求值,它将评估为相同的值。

除了“return”语句不评估任何内容。它们导致封闭方法的当前调用进行评估。没有办法符合参考透明度的概念。 “throw”语句也有类似的问题。

对于示例,第一个

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

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

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

更成问题。如果传递空列表,则返回空列表。如果传递非空列表,则返回列表头部的值加1.