参考透明度是什么意思?我曾听人描述它为“这意味着你可以用等号替换等号”,但这似乎是一个不充分的解释。


当前回答

参考透明度是计算机科学中使用的一个术语。它起源于数学逻辑,但在计算机科学中具有广泛的应用和有效的含义。

它的意思是:可以被其结果替换而不改变其含义的结构(如函数)。

在通常使用中,它与纯表达式相似,但并不完全等效。纯表达式完全由其他纯表达式组成。引用透明表达式可能在内部是不纯的,例如在其计算过程中使用可变状态,但在表达式整体之外没有副作用。

所有纯函数,根据它们的构造,都是指涉透明的,但不一定相反。

许多语言特性都支持不纯引用透明性,比如Haskell中的ST单表,c++中的构造变量和某些lambdas。

有时引用透明性是强制的,而其他时候程序员必须自己保证它。

其他回答

引用透明性是函数式编程中常用的术语,它意味着给定一个函数和一个输入值,您将始终收到相同的输出。也就是说,函数中没有使用外部状态。

下面是一个引用透明函数的例子:

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;
}

另一个例子是面向对象编程语言中的成员函数。成员函数通常对其成员变量进行操作,因此是引用不透明的。成员函数当然可以是引用透明的。

还有一个例子是从文本文件中读取并打印输出的函数。这个外部文本文件可以随时更改,因此该函数将是引用不透明的。

一个表达式是引用透明的,如果它可以用它的值替换,而不改变算法,产生的算法在相同的输入上具有相同的效果和输出。

对于那些需要简明解释的人,我将冒险给出一个解释(但请阅读下面的披露)。

编程语言中的引用透明性促进了等式推理——您拥有的引用透明性越多,就越容易进行等式推理。例如,使用(伪)函数定义,

F x = x + x,

在这个定义的范围内,您可以(安全地)将f(foo)替换为foo + foo,而不会对在哪里执行此简化有太多限制,这很好地说明了您的编程语言具有多大的引用透明性。

例如,在C编程的意义上,如果foo是x++,那么你就不能安全地执行这个约简(也就是说,如果你要执行这个约简,你最终得到的程序将与你开始时的程序不同)。

在实际的编程语言中,你不会看到完美的引用透明性,但函数式程序员比大多数人更关心它(参考Haskell,它是一个核心目标)。

(完全披露:我是一个函数式程序员,所以从上面的答案你应该对这个解释持保留态度。)

当我读到被接受的答案时,我以为我在不同的页面上,而不是在stackoverflow上。

引用透明性是定义纯函数的一种更正式的方式。因此,如果一个函数在相同的输入上始终产生相同的结果,那么它就是引用透明的。

let counter=0
function count(){
  return counter++
}

这不是引用透明的,因为返回值取决于外部变量“counter”,并且它一直在变化。

这是我们如何使它的参考透明:

function count(counter){
       return counter+1
   }

现在这个函数是稳定的,并且在提供相同的输入时总是返回相同的输出。

引用透明函数的作用类似于数学函数;给定相同的输入,它总是会产生相同的输出。它意味着传入的状态没有被修改,并且函数本身没有状态。