在具有懒惰语义的纯功能性的语言(如Haskell中),计算的结果被memoized使得具有相同的输入的功能的进一步的评估不重新计算的值而是直接从memoized值的高速缓存得到它。像Haskell这样的函数式语言中,memoized值的生命期是多少?
我想知道如果这些memoized值获得在某个时间点回收?
- 如果是这样,则意味着memoized值必须在稍后的时间重新计算,并记忆化的好处是不那么退出恕我直言。
- 如果没有,那么OK,这是聪明的缓存的一切......但它意味着一个程序 - 如果运行时间足够长一段 - 将 总是消耗越来越多的内存?
想象一个程序执行密集的数值分析:例如,要查找的使用二分法算法几千几百数学函数列表的根。
每次节目评估与特定的实数的数学函数,结果将被memoized。但是,只有一个非常小的概率 是完全一样的实数将在算法中再次出现,导致内存泄露(或至少,真的不好的用法)。
我的想法是,也许memoized的值只是“作用域”的程序中的某些东西(例如对当前的延续,调用堆栈等),但我无法找到有关该主题的实用内容。
我承认我没有在Haskell编译执行深深的看了(懒惰?),但请,可能有人向我解释,在实践中是如何工作的?
编辑:好吧,我明白了从最初的几个回答我的错误:纯语义意味着引用透明而这又并不意味着自动记忆化,而只是保证会有它没有问题。
我认为网上的一些文章会误导这件事,因为从初学者的角度来看,参考透明属性看起来很酷,因为它允许隐式记忆。
查看http://stackoverflow.com/questions/3951012/when-is-memoization-automatic-in-ghc-haskell – 2011-05-22 16:11:36