【发布时间】:2019-04-01 11:59:03
【问题描述】:
我有以下代码:
memoize f = (map f [0 ..] !!)
fib' 0 = 1
fib' 1 = 1
fib' n = fib' (n - 1) + fib' (n - 2)
fibMemo n = memoize fib' n
fibMemo' = memoize fib'
(我知道斐波那契实现具有指数时间复杂度并且不使用缓存)
我第一次执行fibmemo' 30 需要 3 秒,第二次需要 ~0 秒,因为结果被缓存了。但是第一个版本,fibmemo,并没有得到缓存的结果,它总是需要 3 秒来执行。唯一的区别是定义(据我所知是等价的)。
所以我的问题是,Haskell 中缓存了哪些函数?
我已经阅读了https://wiki.haskell.org/Memoization 并没有解决我的问题。
【问题讨论】:
-
简短的版本是Constant Applicative Forms (CAFs) 被记忆。 (留下这个作为评论,因为它不是一个完整的答案。)
-
如果 30 需要 3 秒,则根本不记忆。即您确实构建了结果缓存,但函数本身不使用该缓存。有关记忆斐波那契的示例,请参见例如this.
标签: haskell caching memoization