参考透明度是什么意思?我曾听人描述它为“这意味着你可以用等号替换等号”,但这似乎是一个不充分的解释。
当前回答
当我读到被接受的答案时,我以为我在不同的页面上,而不是在stackoverflow上。
引用透明性是定义纯函数的一种更正式的方式。因此,如果一个函数在相同的输入上始终产生相同的结果,那么它就是引用透明的。
let counter=0
function count(){
return counter++
}
这不是引用透明的,因为返回值取决于外部变量“counter”,并且它一直在变化。
这是我们如何使它的参考透明:
function count(counter){
return counter+1
}
现在这个函数是稳定的,并且在提供相同的输入时总是返回相同的输出。
其他回答
引用透明函数的作用类似于数学函数;给定相同的输入,它总是会产生相同的输出。它意味着传入的状态没有被修改,并且函数本身没有状态。
引用透明性可以简单地表述为:
一个表达式在任何上下文中总是求相同的结果[1], 一个函数,如果给定相同的参数两次,必须产生相同的结果两次。
例如,编程语言Haskell是一种纯函数式语言;这意味着它是引用透明的。
引用透明函数是只依赖于其输入的函数。
一个表达式是引用透明的,如果它可以用它的值替换,而不改变算法,产生的算法在相同的输入上具有相同的效果和输出。
对于那些需要简明解释的人,我将冒险给出一个解释(但请阅读下面的披露)。
编程语言中的引用透明性促进了等式推理——您拥有的引用透明性越多,就越容易进行等式推理。例如,使用(伪)函数定义,
F x = x + x,
在这个定义的范围内,您可以(安全地)将f(foo)替换为foo + foo,而不会对在哪里执行此简化有太多限制,这很好地说明了您的编程语言具有多大的引用透明性。
例如,在C编程的意义上,如果foo是x++,那么你就不能安全地执行这个约简(也就是说,如果你要执行这个约简,你最终得到的程序将与你开始时的程序不同)。
在实际的编程语言中,你不会看到完美的引用透明性,但函数式程序员比大多数人更关心它(参考Haskell,它是一个核心目标)。
(完全披露:我是一个函数式程序员,所以从上面的答案你应该对这个解释持保留态度。)