return 会破坏参照透明性吗?
Does return break referential transparency?
我正在阅读 Scala WartRemover 工具的描述,并且对其中的一个要点感到困惑。描述是这样说的:
return
breaks referential transparency. Refactor to terminate
computations in a safe way.
// 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
关键字是否有某种方式使函数更有可能破坏引用透明性?我是不是完全误解了他们的意思?
引用透明性的核心是评估表达式。从根本上说,如果您在一个上下文中计算一个表达式,那么如果您在任何相同的上下文中计算它,它将计算出相同的值。
除了 "return" 语句根本不求值。它们导致封闭方法的当前调用计算出某些东西。没有办法符合参照透明的概念。 "throw" 语句也有类似的问题。
示例,第一个
def foo(n:Int): Int = return n + 1
是良性的,但冗长且非惯用语。第二个
def foo(ns: List[Int]): Any = ns.map(n => return n + 1)
问题更大。如果传递空列表,它 returns 空列表。如果传递一个非空列表,它 returns 列表头部的值加 1。
我正在阅读 Scala WartRemover 工具的描述,并且对其中的一个要点感到困惑。描述是这样说的:
return
breaks referential transparency. Refactor to terminate computations in a safe way.// 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
关键字是否有某种方式使函数更有可能破坏引用透明性?我是不是完全误解了他们的意思?
引用透明性的核心是评估表达式。从根本上说,如果您在一个上下文中计算一个表达式,那么如果您在任何相同的上下文中计算它,它将计算出相同的值。
除了 "return" 语句根本不求值。它们导致封闭方法的当前调用计算出某些东西。没有办法符合参照透明的概念。 "throw" 语句也有类似的问题。
示例,第一个
def foo(n:Int): Int = return n + 1
是良性的,但冗长且非惯用语。第二个
def foo(ns: List[Int]): Any = ns.map(n => return n + 1)
问题更大。如果传递空列表,它 returns 空列表。如果传递一个非空列表,它 returns 列表头部的值加 1。