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这样的"数学意义"中的函数,那么你就不会有任何问题,这些函数是参考透明的.
引用透明性意味着在给定相同输入的情况下,函数将始终返回相同的输出.因此,如果函数是懒惰或严格的话无关紧要.惰性函数将在未来某个未知时间计算其输出,但由于参考透明性,您可以保证输出对于给定输入始终相同.
因此,在某种程度上,引用透明性可确保惰性函数的正确性.