在具有惰性语义(例如Haskell)的纯函数式语言中,计算结果会被缓存,以便使用相同输入再次调用函数时不会重新计算该值,而是直接从缓存的缓存值中获取。
我想知道这些备忘录值是否会在某个时间点被回收利用?
如果是这样,那么备忘录值必须在稍后的时间重新计算,备忘录化的好处在我的看法中并没有那么令人兴奋。
如果不是,那么好吧,这很聪明地缓存了一切...但这是否意味着程序 - 如果运行足够长的时间 - 将始终消耗越来越多的内存?
想象一下执行密集数值分析的程序:例如使用二分法算法找到一百万个数学函数的根。
每次程序使用特定实数评估数学函数时,结果将被备忘录。 但是,在算法期间几乎不可能再次出现完全相同的实数,导致内存泄漏(或至少非常糟糕的使用)。
我的想法是,备忘录值可能只是“作用域”于程序中的某些东西(例如当前连续、调用堆栈等),但我无法找到有关此主题的实用信息。
我承认我没有深入研究Haskell编译器实现(惰性?),但请问有人能向我解释它在实践中如何工作吗?
编辑:好吧,我从前几个答案中了解了我的错误:纯语义意味着参考透明度,这又不意味着自动备忘录,但仅保证不会出现问题。
我认为网上的一些文章对此存在误导,因为从初学者的角度来看,参考透明度属性似乎很酷,因为它允许隐式备忘录化。
我想知道这些备忘录值是否会在某个时间点被回收利用?
如果是这样,那么备忘录值必须在稍后的时间重新计算,备忘录化的好处在我的看法中并没有那么令人兴奋。
如果不是,那么好吧,这很聪明地缓存了一切...但这是否意味着程序 - 如果运行足够长的时间 - 将始终消耗越来越多的内存?
想象一下执行密集数值分析的程序:例如使用二分法算法找到一百万个数学函数的根。
每次程序使用特定实数评估数学函数时,结果将被备忘录。 但是,在算法期间几乎不可能再次出现完全相同的实数,导致内存泄漏(或至少非常糟糕的使用)。
我的想法是,备忘录值可能只是“作用域”于程序中的某些东西(例如当前连续、调用堆栈等),但我无法找到有关此主题的实用信息。
我承认我没有深入研究Haskell编译器实现(惰性?),但请问有人能向我解释它在实践中如何工作吗?
编辑:好吧,我从前几个答案中了解了我的错误:纯语义意味着参考透明度,这又不意味着自动备忘录,但仅保证不会出现问题。
我认为网上的一些文章对此存在误导,因为从初学者的角度来看,参考透明度属性似乎很酷,因为它允许隐式备忘录化。