怠惰なセマンティクスを持つ純粋な関数型言語(Haskellなど)では、計算結果がメモ化されるため、同じ入力を持つ関数をさらに評価しても、値は再計算されず、メモ化された値のキャッシュから直接取得されます。
これらのメモ化された値は、ある時点でリサイクルされるのでしょうか。
- もしそうなら、それはメモ化された値が後で再計算されなければならないことを意味し、メモ化の利点は私見からそれほど離れていません。
- そうでない場合は、OK、これはすべてをキャッシュするのに賢いです...しかし、プログラムが-十分に長い期間実行された場合-常により多くのメモリを消費することを意味しますか?
集中的な数値解析を実行するプログラムを想像してみてください。たとえば、二分法アルゴリズムを使用して、数十万の数学関数のリストの根を見つけます。
プログラムが特定の実数で数学関数を評価するたびに、結果はメモ化されます。ただし、アルゴリズム中にまったく同じ実数が再び表示され、メモリリーク(または少なくとも非常に悪い使用法)が発生する可能性は非常に低いです。
私の考えでは、メモ化された値は、プログラム内の何か(たとえば、現在の継続、呼び出しスタックなど)に単純に「スコープ」されますが、この主題に関して実用的なものを見つけることができませんでした。
Haskellコンパイラの実装を深く調べていないことは認めますが(怠惰ですか?)、実際にどのように機能するかを誰かに説明してもらえますか?
編集:わかりました、最初のいくつかの答えから私の間違いを理解しています:純粋なセマンティクスは参照透過性を意味します。これは自動メモ化を意味しませんが、問題がないことを保証するだけです。
初心者の観点からは、暗黙のメモ化が可能であるため、参照透過性プロパティは非常に優れているように思われるため、Web上のいくつかの記事はこれについて誤解を招くと思います。