定义参考透明度和确定性函数之间有什么区别?

时间:2016-01-18 18:06:40

标签: functional-programming computer-science

参考透明度(Wikipedia):

  

如果可以,表达式被认为是引用透明的   在不改变程序行为的情况下替换它的值(in   换句话说,产生一个具有相同效果和输出的程序   在相同的输入上。)

还有(Learn you some Erlang):

  

对于同一参数,函数始终返回相同的结果   称为引用透明度

确定性函数(MSDN):

  

确定性函数总是在它们出现时返回相同的结果   使用一组特定的输入值调用。

如果我们谈论确定性功能,我们是指参考透明度?如果我们谈论参考透明度,我们的意思是确定性函数?

2 个答案:

答案 0 :(得分:4)

表达式可能比简单的函数调用更复杂,因此"参考透明度"适用于比确定性"更大的实体类别。当应用于函数时,它们基本相同,因为当且仅当它是确定性的时,函数应用程序是引用透明的。由确定性函数构建的表达式将是参考透明的,尽管也可以使表达式在引用上是透明的,即使它的某些成分是非确定性的(0*rand()用于一个愚蠢的例子,尽管傻了使用随机种子获得确定性答案的例子。

答案 1 :(得分:2)

请注意,您对参照透明度的定义特别提到“在同一输入上的相同效果和输出”。如果您的表达式包含效果,例如I / O,那么它可以是引用透明而不是确定性的(两者都如上所定义)。

另一方面,纯函数式编程侧重于没有效果的函数,这些函数可以是可靠的确定性的。确定性函数必然是引用透明的,但反之则不然。

考虑区分“效果”,这是首先编写程序的重要和必要的业务,以及可能发生对调用者不明显的影响的“副作用”。这种不透明度与参照透明度相反,是因为很难推断出你所调用的代码。