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

これは実際にはそれほど高速ではなく、スペースリークですが、一般的な考え方を捉えています。詳細については、Haskellwikiをご覧ください。

于 2012-09-12T14:52:32.203 に答える