【ちえんひょうか】

遅延評価 とは?

💡 「必要になるまで働かない」賢い計算の先送り術
📌 このページのポイント
遅延評価 vs 先行評価 先行評価(Eager) 定義 即計算 計算済み 使わなくても 使わない → 無駄 遅延評価(Lazy) 定義 未計算 サンク 計算待ち 値が必要 → その場で計算 結果 必要分のみ 例:無限リスト [1, 2, 3, ...∞] → take(5) で最初の5件だけ計算 Haskell / Python generator / JavaScript generator function
遅延評価:値が必要になったときだけ計算するイメージ
ひよこ ひよこ

遅延評価って、計算をサボるってこと?

ペンギン先生 ペンギン先生

うまい表現だね!値を使うその瞬間まで計算を後回しにする戦略だよ。使われなければ計算自体が発生しないんだ。

ひよこ ひよこ

普通はどうやって計算してるの?

ペンギン先生 ペンギン先生

通常の「先行評価(Eager Evaluation)」では、式が現れた瞬間にすぐ計算するよ。でも遅延評価は「誰かが値を要求したとき」だけ計算するんだ。

ひよこ ひよこ

無限リストが扱えるって本当なの?

ペンギン先生 ペンギン先生

本当だよ!例えば「自然数の無限リスト」を定義しても、実際に取り出す分だけ計算するから無限でも問題ないんだ。Haskellでは `[1..]` みたいに書けるよ。

ひよこ ひよこ

JavaScriptでも使えるの?

ペンギン先生 ペンギン先生

Promiseやジェネレーター関数(`function*`)が似た概念だよ。ジェネレーターは `yield` されるまで次の値を計算しないんだ。Pythonのジェネレーターも同じ考え方だよ。

ひよこ ひよこ

注意点はあるの?

ペンギン先生 ペンギン先生

計算のタイミングが読みにくくなるから、デバッグが難しくなることがあるよ。また副作用のある処理(ファイル書き込みなど)を遅延評価と組み合わせると、実行順序が予想外になることがあるんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「遅延評価」って出てきたら「必要になったときだけ計算するしくみ」と思えればだいたいOK!
📖 おまけ:英語の意味
「Lazy Evaluation」 = 怠惰な評価
💬 「Lazy(怠惰な)」という名前は、必要になるまで計算しない「怠け者」な振る舞いから来ているんだよ。対義語は即座に計算する「Eager Evaluation(先行評価)」だよ
← 用語集にもどる