7

可能的重复:
GHC Haskell 中的记忆何时自动?

因此,纯函数总是为固定输入返回相同的值。也就是说,如果有足够的内存(问题 1),Haskell(更准确地说是 GHC)会自动缓存(记忆)这些结果吗?开发人员是否可以控制它(问题 2)?

4

1 回答 1

10

我投票结束,但简短的回答:

GHC 不会对函数进行任何自动记忆,这可能是一件好事,因为它会使空间复杂性更加难以推理。此外,记忆化通常不是一个非常容易解决的问题,因为它要求函数的参数具有可比性,这对于所有类型(例如,函数)实际上是不可能的。

Haskell 具有非严格的语义。GHC 提供了一个或多或少的按需调用成本模型。尽管由于严格分析器的原因,在高优化级别的惰性评估的开销并没有那么糟糕。

在 Haskell 中使用惰性求值很容易实现记忆。不过要小心空间使用。

fib' :: (Integer -> Integer) -> Integer -> Integer
fib' f 0 = 0
fib' f 1 = 1
fib' f n | n > 1 = (f (n - 1)) + ((f (n - 2))

slow_fib :: Integer -> Integer
slow_fib = fib' slow_fib

fibs :: [Integer]
fibs = map (fib' memo_fib) [0..] 

memo_fib :: Integer -> Integer
memo_fib n = fibs !! n

这实际上并没有那么快,并且是空间泄漏,但抓住了一般的想法。您可以在 Haskell wiki 上了解更多信息

于 2012-09-12T14:52:32.203 回答