【发布时间】:2015-04-25 03:28:19
【问题描述】:
这是我的代码:
import Data.Function.Memoize
import Debug.Trace
foo :: Int -> Int -> Int
foo a = memoFix fooMemo where
fooMemo f x = a + (trace (show x) cont) where
cont = if x == 0 then 0 else x + f (x - 1)
main = do
print $ foo 0 5
print $ foo 0 5
print $ foo 0 5
我希望它会打印出来:
3
2
1
0
6
6
6
但是,相反,它会打印:
3
2
1
0
6
3
2
1
0
6
3
2
1
0
6
换句话说,函数并没有像我预期的那样被记忆。这可能是因为每次调用“foo 0”时,都会为“foo”创建一个新的备忘录表。如何强制 GHC 只评估一次“memoFix fooMemo”,这样它就不会创建多个 memotable?
【问题讨论】:
-
Data.Function.Memoize来自什么包? -
@DanielWagner memoize
-
FWIW,我发现您的代码行为与您报告的行为非常不同。我认为您的实际代码可能使用
3作为最后一个参数,而不是5。
标签: haskell lazy-evaluation memoization