2012-09-12 11 views
6

可能性の重複の結果:結果として
ハスケル、純粋な関数のメモ化が

When is memoization automatic in GHC Haskell?

を、純粋な関数は常に一定の入力に対して同じ値を返します。つまり、十分なメモリがある場合(質問1)、開発者はそれに対して何らかのコントロールを持っている場合(質問2)、Haskell(より正確にはGHC)はこれらの結果を自動的にキャッシュ(メモ)しますか?

+1

@LoganCapaldoああ、はい、わかります。しかし、そのポストは約2歳です、多分いくつかの進歩があった。 – Cartesius00

+3

質問を編集してa)他のものを認識し、b)元の回答と比較して「進歩」が意味すること、またはなぜ「進歩」が起こるのか、なぜそうでないのかを明確にしてください。私はそれに入る準備ができていませんが、あなたが想像しているかもしれない種類の自動メモは、最初の紅潮で現れる可能性があるよりも大きな虫です。 –

答えて

11

私は閉じるために投票したが、短い答え:

GHCは、関数のいずれかの自動メモ化を行いませんし、それは程度の理由スペースの複雑さがさらに困難になるだろうので、それはおそらく良いことです。また、memoizationは一般に非常に解決しやすい問題ではありません。なぜなら、関数の引数は、すべての型(関数など)では実際には不可能な等価に匹敵する必要があるからです。

ハスケルは厳密でないセマンティクスを持っています。 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することができます。

関連する問題