这些术语的定义确实不同,但我一直认为其中一个隐含着另一个;我想不出在任何情况下,一个表达式是引用透明的,但不是纯的,反之亦然。
维基百科为这些概念保留了单独的文章,并说:
来自参考透明度
如果表达式中涉及的所有函数都是纯函数,则表达式是引用透明的。此外,如果舍弃了一些不纯函数的值,并且它们的副作用很小,则可以将它们包含在表达式中。
来自纯表达
构造纯表达式需要纯函数。..。纯表达式通常被称为引用透明。
我觉得这些说法令人费解。如果所谓的“不纯函数”的副作用是微不足道的,以至于不允许执行它们(即用它的值替换对这样一个函数的调用),而不需要对程序进行实质性的更改,那么它就像最初的纯粹一样,不是吗?
是否有更简单的方法来理解纯表达式和引用透明表达式(如果有的话)之间的区别?如果有不同之处,最好有一个能清楚地证明这一点的示例表达式。
发布于 2011-02-11 04:23:22
如果我在一个地方聚集了我认识的三个理论家,他们中至少有两个在“参考透明度”一词的含义上存在分歧。当我还是个年轻的学生时,我的导师给了我一篇论文,解释说,即使你只考虑专业文献,“参考透明”这个短语至少意味着三种不同的东西。(不幸的是,那张纸在一盒尚未扫描的重印盒中。我搜索了谷歌奖学金,但没有成功。)
我不能告诉你,但我可以建议你放弃:因为即使是一小撮头脑敏锐的语言理论家也不能就它的含义达成一致,“参考透明”一词是,而不是有用的。所以不要用它。
在任何与编程语言语义相关的话题上,维基百科都是不可靠的。我已经放弃了修复它的尝试;维基解密的过程似乎将改变和大众投票视为稳定性和准确性。
发布于 2011-02-02 15:03:56
所有纯函数都必然是引用透明的。根据定义,除了传递的内容之外,它们不能访问其他任何内容,因此它们的结果必须完全由它们的论点来决定。
然而,有可能具有非纯的参考透明功能。我可以编写一个函数,它被赋予一个int i,然后生成一个随机数r,从它本身减去r并将它放置在s中,然后返回i - s。显然,这个函数是不纯的,因为它正在生成随机数。然而,它是指透明的。在这种情况下,这个例子是愚蠢和人为的。但是,例如,在Haskell中,id函数是a - > a类型,而我的stupidId函数将是a -> IO a类型,这表明它使用了副作用。当程序员可以通过外部证明来保证他们的函数实际上是引用透明的,那么他们就可以使用unsafePerformIO将IO从类型中去掉。
发布于 2015-04-24 13:59:10
这些幻灯片来自于一次ACCU2015演讲对引用透明度的主题有一个很好的总结。
其中一张幻灯片:
如果(a)每个子表达式可以被与其值相等的任何其他表达式替换,并且(b)给定上下文中所有表达式的出现都产生相同的值,则语言是引用透明的。
例如,您可以有一个将其计算记录到程序标准输出的函数(因此,它不会是一个纯函数),但是您可以用一个不记录其计算的类似函数来替换对该函数的调用。因此,该函数具有引用透明性。但是..。上面的定义是关于语言,而不是表达,正如幻灯片强调的那样。
..。就好像它一开始是纯的,不是吗?
从我们的定义来看,不,不是的。
是否有更简单的方法来理解纯表达式和引用透明表达式(如果有的话)之间的区别?
试试我上面提到的幻灯片。
https://stackoverflow.com/questions/4865616
复制相似问题