我一直认为 Haskell 会做某种自动智能记忆。例如,朴素的斐波那契实现
fib 0 = 0
fib 1 = 1
fib n = fib (n-2) + fib (n-1)
因此会很快。现在我读了这篇文章,似乎我错了——Haskell 似乎没有自动记忆。还是我理解错了?
是否有其他语言可以进行自动(即隐式,非显式)记忆?
实现memoization的常用方法有哪些?在我见过的所有示例实现中,它们都使用哈希图,但它的大小没有任何限制。显然,这在实践中是行不通的,因为您需要某种限制。鉴于此,它变得更加复杂,因为当您达到极限时,您必须丢弃一些数据。那里变得复杂了:限制是否应该是动态的并且经常使用的功能应该比不经常使用的功能具有更高的限制?当你达到极限时你会扔掉什么条目?只是最近用过的吗?在这种情况下,您还需要另外对数据进行排序。您可以使用链表和哈希映射的某种组合来实现这一点。这是常见的方式吗?
您能否链接(或参考)一些常见的现实世界实现?
谢谢,阿尔伯特
编辑:我最感兴趣的是我描述的那个问题,即如何实现这样的限制。对解决此问题的任何论文的任何引用都会非常好。
编辑:可以在这里找到一些自己的想法和示例实现(有限制) 。
编辑:我不是要解决特定应用程序中的特定问题。我正在寻找可以全局应用于(纯功能)程序的所有功能的记忆通用解决方案(因此不实现内存限制的算法不是解决方案)。当然,(可能)没有最佳/最佳解决方案。但这使我的问题不那么有趣。
为了尝试这样的解决方案,我考虑将其添加到 Haskell 作为优化。我真的很想知道它的表现会有多好。
我想知道是否有人已经这样做了。