非正格と遅延評価って何が違うの?
#プログラミング言語の評価戦略
概要
「理論(セマンティクス)」と「実装(メカニズム)」の違い
非正格な言語(Haskellなど)を作るには、遅延評価(Call by Need)で実装するのがベスト
Non-strict: 引数が ⊥ でも関数が ⊥ にならない性質。
Lazy: Non-strict を「Call by Need」で実装したもの。
「この言語は非正格だね」と言ったときは、「引数がエラーでも動くような数学的な性質を持っているね」という意味
「このコードは遅延評価されているね」と言ったときは、「今、Call by Need(メモ化付きのサボり)のメカニズムが動いているね」という意味
非正格 (Non-strict) は「理論・性質」
非正格とは、関数の「定義」や「意味論(セマンティクス)」に関する性質を指します。
定義: もし、ある引数が「未定義(エラーや無限ループ)」だったとしても、関数全体が正しく値を返せる場合、その関数は非正格であると言います。
数学的な見方: f(⊥)=⊥ (ボトムを渡しても、結果がボトムにならない)
ポイント: これは「いつ計算するか」という手順の話ではなく、「計算できなくても答えが出るというルール」の話です。
遅延評価 (Lazy Evaluation) は「実装・戦略」
遅延評価は、非正格という「理論」を実現するための具体的なテクニック(実装方法)を指します。
定義: 式が必要になるまで計算を遅らせ、さらに一度計算した結果を再利用(メモ化)する仕組みです。
関係: 遅延評価=名前渡し+メモ化(つまり、Call by Need のこと)
ポイント: 非正格な挙動を実現するために、最も効率的な方法として「遅延評価」が選ばれます。