Haskell 和纯函数结果的内存

标签 haskell ghc memoization

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/

相关文章:

c++ - 从 Haskell 调用 C++ 时无法运行 `stack ghci`

scala - 在Scala中使用哪种类型存储内存中的可变数据表?

haskell - 从 Haskell Quickcheck 获取函数输出(以及输入)

haskell - Template Haskell 中的类型声明

haskell - 为什么 GHC 不对 "No match in record selector"异常给出编译时警告?

haskell - 树状数据结构上的记忆化问题

java - 内存效率问题(Collat​​z Hailstone 序列)

Haskell 'any' 函数 - 素性检查

haskell - Haskell 中 >>= 的左递归

haskell - Aeson:如何解析带有字符串化对象元素的对象?