【せんこうひょうか】

先行評価 とは?

💡 「聞いた瞬間に答えを出す」即断即決タイプの評価戦略。
📌 このページのポイント
先行評価(Eager Evaluation) x = heavyCalc() すぐ計算! x = 42(結果を格納) 比較:遅延評価 x = heavyCalc() まだ計算しない x を使う時に計算 ← ほとんどの言語のデフォルト Haskell等の関数型言語
先行評価は式に到達した瞬間に計算する。遅延評価とは対照的
ひよこ ひよこ

プログラムって、式をいつ計算するかって選べるの?

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

そうだよ。大きく分けて「すぐ計算する先行評価」と「必要になるまで待つ遅延評価」の2種類があるんだ。

ひよこ ひよこ

先行評価って、どんなタイミングで計算するの?

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

式が書かれた場所に到達した瞬間に計算するよ。たとえば `x = 1 + 2` と書いたら、その行を実行した瞬間に 3 が計算されて x に入るんだ。

ひよこ ひよこ

それって当たり前じゃないの?

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

実はそれが「先行評価」の特徴なんだよ。C、JavaPythonJavaScriptなどほとんどの言語がこの方式を採用しているから「当たり前」に感じるんだね。

ひよこ ひよこ

遅延評価と比べて、先行評価のメリットって何なの?

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

副作用の実行順序が書いた通りになるから、動きが予測しやすくてデバッグしやすいんだ。「いつ計算されたかわからない」という混乱が起きにくいよ。

ひよこ ひよこ

デメリットもあるの?

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

使わない値まで計算してしまうことがあるんだ。たとえば関数の引数を全部先に評価してしまうから、後で使わない引数のコストも払うことになる。無限リストの表現も苦手だよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「先行評価」って出てきたら「すぐ計算するやつ」と思えればだいたいOK!
📖 おまけ:英語の意味
「Eager Evaluation」 = 先行評価・即時評価
💬 eager は「熱心な・せっかちな」という意味の英単語で、式を見つけた途端に「すぐ計算したがる」ふるまいを表しているんだよ。
← 用語集にもどる