为什么懒惰与参考透明度相吻合?

vuz*_*zun 6 haskell referential-transparency lazy-evaluation

我正在阅读Haskell教程(Learn You a Haskell),其中作者说懒惰与参考透明度相得益彰.经过更多的阅读和一些搜索,我仍然不明白为什么.请注意,我确实理解参考透明度和懒惰的优点,但是它们在一起令我感到不安.

这两者结合有什么特别的好处吗?

或者也许作者只是想说他们都很高兴并且表达得那么含糊不清?

Lan*_*dei 11

这真的很容易.非严格(例如懒惰)评估意味着可以推迟任务.但是为了推迟某些事情,你更好地确保你得到的结果与你现在得到的结果相同,这就是参考透明度.考虑这个命令式Java代码:

long start = System.currentTimeMillis(); //get the start time
runBenchmarkFunction();
System.out.println("Run took " + (System.currentTimeMillis() - start) + " ms"); 
Run Code Online (Sandbox Code Playgroud)

现在,一种懒惰的语言会推迟第一行的评估,因为只需要在第三行开始.所以结果将是0(或非常接近它).可能这不是你想要的.出现这种麻烦的原因是System.currentTimeMillis 不是参照透明的.如果它是像sin或ln这样的"数学意义"中的函数,那么你就不会有任何问题,这些函数参考透明的.

  • 该问题被标记为“haskell”。但是,如果您想象正确的语义,您所写的内容仍然是完全引用透明的。而且,如果您想象其他语义,那么事实并非如此。但这里的关键词是“想象”。 (2认同)

Abh*_*kar 5

引用透明性意味着在给定相同输入的情况下,函数将始终返回相同的输出.因此,如果函数是懒惰或严格的话无关紧要.惰性函数将在​​未来某个未知时间计算其输出,但由于参考透明性,您可以保证输出对于给定输入始终相同.

因此,在某种程度上,引用透明性可确保惰性函数的正确性.