Possible Duplicate:
When is memoization automatic in GHC Haskell?
因此,纯函数对于固定输入始终返回相同的值。也就是说,如果有足够的内存(问题 1),Haskell(更准确地说是 GHC)是否会自动缓存(内存)这些结果,并且开发人员对此有任何控制权(问题 2)吗?
最佳答案
我投票结束,但答案很简短:
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
这实际上并没有那么快,并且存在空间泄漏,但捕获了总体思路。您可以learn more on the Haskell wiki .
关于Haskell 和纯函数结果的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12390389/