在具有惰性语义的纯函数式语言(例如 Haskell)中,计算结果被记忆化,因此对具有相同输入的函数的进一步评估不会重新计算值,而是直接从记忆值的缓存中获取。
我想知道这些记忆值是否会在某个时间点被回收?
- 如果是这样,这意味着必须在以后重新计算记忆值,并且记忆化的好处并不是那么退出恕我直言。
- 如果不是,那么好吧,这很聪明,可以缓存所有内容......但这是否意味着程序 - 如果运行足够长的时间 - 总是会消耗越来越多的内存?
想象一个程序执行密集的数值分析:例如,使用二分法算法查找数十万个数学函数列表的根。
每次程序评估具有特定实数的数学函数时,结果都会被记忆。但是在算法过程中再次出现完全相同的实数的可能性很小,从而导致内存泄漏(或者至少是非常糟糕的使用)。
我的想法是,记忆值可能只是“限定”到程序中的某些内容(例如,当前延续、调用堆栈等),但我无法找到关于该主题的实用内容。
我承认我没有深入研究 Haskell 编译器的实现(懒惰?),但是请有人向我解释一下它在实践中是如何工作的?
编辑:好的,我从前几个答案中理解了我的错误:纯语义意味着参照透明,这反过来并不意味着自动记忆,但只是保证不会有问题。
我认为网络上的一些文章对此具有误导性,因为从初学者的角度来看,Referential Transparency 属性似乎很酷,因为它允许隐式记忆。