【发布时间】:2011-08-10 13:55:07
【问题描述】:
我一直认为 Haskell 会进行某种自动智能记忆。例如,朴素的斐波那契实现
fib 0 = 0
fib 1 = 1
fib n = fib (n-2) + fib (n-1)
因此会很快。现在我读了this,看来我错了——Haskell 似乎没有自动记忆。还是我理解错了?
是否有其他语言可以进行自动(即隐式,非显式)记忆?
实现memoization的常用方法有哪些?在我见过的所有示例实现中,它们都使用哈希图,但它的大小没有任何限制。显然,这在实践中是行不通的,因为您需要某种限制。鉴于此,它变得更加复杂,因为当您达到极限时,您必须丢弃一些数据。那里变得复杂了:限制是否应该是动态的并且经常使用的函数应该比不经常使用的函数有更高的限制?当你达到极限时你会扔掉什么条目?只是最近用过的吗?在这种情况下,您还需要另外对数据进行排序。您可以使用链表和哈希映射的某种组合来实现这一点。这是常见的方式吗?
您能否链接(或参考)一些常见的实际实现?
谢谢, 阿尔伯特
编辑:我最感兴趣的是我描述的那个问题,即如何实现这样的限制。对解决此问题的任何论文的任何引用都会非常好。
编辑:可以在here 找到一些自己的想法以及示例实现(有限制)。
编辑:我不是在尝试解决特定应用程序中的特定问题。我正在寻找可以全局应用于(纯函数式)程序的所有函数的记忆化通用解决方案(因此不实现内存限制的算法不是解决方案)。当然,(可能)没有最佳/最佳解决方案。但这让我的问题不那么有趣了。
为了尝试这样的解决方案,我考虑将它添加到 Haskell 作为优化。我真的很想知道它的表现会有多好。
我想知道是否有人已经这样做了。
【问题讨论】:
-
如果每个函数的每个调用都被记忆,空间使用会爆炸。 Haskell 实际上所做的是在共享这些值时不重新计算已经评估过的东西。
-
碰巧,最近有一篇关于这个确切主题的博客文章:augustss.blogspot.com/2011/04/…
-
@Don:这正是我在问题中所说的。
-
@MatrixFrog:似乎它并没有真正解决我在问题中描述的问题,即主要是内存限制及其解决方案/实现。
-
听起来你真正感兴趣的问题是垃圾收集。
标签: haskell functional-programming memoization