参考透明度是什么意思?我曾听人描述它为“这意味着你可以用等号替换等号”,但这似乎是一个不充分的解释。
当前回答
引用透明性是函数式编程中常用的术语,它意味着给定一个函数和一个输入值,您将始终收到相同的输出。也就是说,函数中没有使用外部状态。
下面是一个引用透明函数的例子:
int plusOne(int x)
{
return x+1;
}
对于引用透明函数,给定一个输入和一个函数,您可以用一个值替换它,而不是调用函数。所以我们不用参数5来调用+ one,我们可以用6来代替它。
另一个很好的例子是一般的数学。在数学中,给定一个函数和一个输入值,它总是映射到相同的输出值。F (x) = x + 1。因此,数学中的函数是指透明的。
这个概念对研究人员来说很重要,因为它意味着当您拥有一个引用透明的函数时,它有助于实现简单的自动并行化和缓存。
引用透明性总是用在像Haskell这样的函数式语言中。
--
与之相反的是参照不透明的概念。这句话的意思正好相反。调用该函数可能并不总是产生相同的输出。
//global G
int G = 10;
int plusG(int x)
{//G can be modified externally returning different values.
return x + G;
}
另一个例子是面向对象编程语言中的成员函数。成员函数通常对其成员变量进行操作,因此是引用不透明的。成员函数当然可以是引用透明的。
还有一个例子是从文本文件中读取并打印输出的函数。这个外部文本文件可以随时更改,因此该函数将是引用不透明的。
其他回答
引用透明性可以简单地表述为:
一个表达式在任何上下文中总是求相同的结果[1], 一个函数,如果给定相同的参数两次,必须产生相同的结果两次。
例如,编程语言Haskell是一种纯函数式语言;这意味着它是引用透明的。
如果你对词源感兴趣(比如。为什么这个概念有这个特殊的名字),看看我关于这个主题的博客文章。这个术语来自哲学家/逻辑学家奎因。
引用透明函数是只依赖于其输入的函数。
当我读到被接受的答案时,我以为我在不同的页面上,而不是在stackoverflow上。
引用透明性是定义纯函数的一种更正式的方式。因此,如果一个函数在相同的输入上始终产生相同的结果,那么它就是引用透明的。
let counter=0
function count(){
return counter++
}
这不是引用透明的,因为返回值取决于外部变量“counter”,并且它一直在变化。
这是我们如何使它的参考透明:
function count(counter){
return counter+1
}
现在这个函数是稳定的,并且在提供相同的输入时总是返回相同的输出。
引用透明函数的作用类似于数学函数;给定相同的输入,它总是会产生相同的输出。它意味着传入的状态没有被修改,并且函数本身没有状态。