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

vvv*_*vvv 7 computer-science functional-programming

参考透明度(维基百科):

如果表达式可以替换为其值而不改变程序的行为(换句话说,产生在相同输入上具有相同效果和输出的程序),则表示该表达式是引用透明的.

而且(了解一些Erlang):

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

确定性函数(MSDN):

确定性函数在使用一组特定输入值调用时始终返回相同的结果.

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

com*_*orm 6

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

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

考虑区分“效果”和“副作用”,“效果”是编写程序的首要且必要的工作,而“副作用”可能会出现调用者不明显的效果。这种不透明性与引用透明性相反,它使得很难推理您正在调用的代码。


Joh*_*man 6

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