5.1 遅延評価とは


ついにここまで来ました。遅延評価。
いろいろな入門サイトで見たけど、どうしても理解することが出来なかった。
ここは、腰を据えてじっくり勉強しよう。

置き換えモデルについて

う〜ん、分かったつもりだけど、少し自信がない。もうちょっと先を読めばもっと分かるかな?
今の時点での理解はこんな感じ。


C言語の関数は、関数呼び出しによって、関数が定義されたアドレスにジャンプする。
一方マクロは、マクロ呼び出し場所に、マクロ定義が展開される。
Haskellの関数はC言語のマクロに近いのかなぁ。
引数の置き換えがマクロの置き換えの後に発生するところも似てる。


・・・と思ったけど、グラフ簡約の説明を読むと、マクロでもない。
マクロは同じ引数でも別々に評価されちゃうから。


この最外簡約という方法はHaskell(他の関数型言語も含まれるのかも)固有の方法なのかも知れない。

必要がなければ評価しない、について

Haskellの遅延評価では、処理に必要な部分しか評価しない。
う〜ん、分かったようで分からない。


こういう時はC言語と比較してみよう。
C言語のif文でたとえば

if(isTrue()) {
    printf("Trueだよ\n");
} else {
    printf("Falseだよ\n");
}


というコードがあるとすると、isTrue()がTRUEを返せば、printf("Falseだよ\n")は実行されません。
本書中にあった、myIf関数はこれと同じノリかな?
でも、printf("Falseだよ\n")が実行されちゃうとif文の存在意義が問われてしまうような気がする。


データ構造の遅延評価はとても分かりやすい。
C言語でイメージすると

char array[5] = {'a'+1, 'b'+2, 'c'+3, 'd'+4, 'e'+5, '\0'};
printf("arrayの長さは%dです\n", strlen(array));


これまであまり意識したことはありませんでしたが、
C言語では、arrayの宣言時に各要素の計算が実行されちゃうと思う。
Haskellでは各要素の計算がされないまま、文字列の長さだけが計算される。


本書ではこのような遅延評価によって、巨大な入力に対しても処理速度を保つことが出来る、
と書かれていましたが、遅延評価のありがたみって処理速度なんでしょうか?
う〜ん、何か違うような気がする。処理速度もあるんでしょうけど。


もうちょっと読み進めると答えが見つかるかも知れませんね。