Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell与纯函数结果的记忆化_Haskell_Ghc_Memoization - Fatal编程技术网

Haskell与纯函数结果的记忆化

Haskell与纯函数结果的记忆化,haskell,ghc,memoization,Haskell,Ghc,Memoization,可能重复: 因此,对于固定的输入,纯函数总是返回相同的值。也就是说,如果有足够的内存(问题1),Haskell(更准确地说是GHC)会自动缓存(记忆)这些结果吗?开发人员对这些结果有控制权吗(问题2)?我投票决定关闭,但简短的回答是: GHC不会自动记忆函数,这可能是一件好事,因为它会使空间复杂性更加难以推理。此外,记忆化通常不是一个很容易解决的问题,因为它要求函数的参数在相等性方面具有可比性,这对于所有类型(例如函数)来说都是不可能的 Haskell具有非严格语义。GHC或多或少提供了一个按

可能重复:


因此,对于固定的输入,纯函数总是返回相同的值。也就是说,如果有足够的内存(问题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

这实际上并没有那么快,是一个空间泄漏,但抓住了总体思路。你可以。

@LoganCapaldo哦,是的,我明白了。但是这篇文章已经发表了大约2年了,可能有一些进展。如果你将你的问题编辑为a)承认另一个问题,b)澄清你所说的“进展”相对于原始答案的含义,或者为什么会出现或为什么不会出现“进展”,那么可能会有一些有价值的答案。我不准备进入这一领域,但我想你会发现,你可能想象的那种自动记忆比乍一看可能会出现的更大。