関数型プログラミング言語Haskell Part19
■ このスレッドは過去ログ倉庫に格納されています
0738デフォルトの名無しさん
2012/09/12(水) 12:50:31.15> 確かに遅延評価を行っているなら最終的に各々の値が必要なのか分かっている状態になってから計算を始めるので、
違うよ。
遅延評価だけど、最終的に各々の値が必要なのかは、その時になってみないと分からないよ。
値が評価されたら、評価された値はメモリに残る。
しばらくメモリに残って、ガベージコレクタが動いたときにもう必要ないなら、
その時点でメモリから消される。
今回の (x:ys) は「評価されなかった」からメモリに残らなかった。
と考えてほぼ間違いない。
Haskell コードは GHC によってどのような C ソースにコンパイルされるかと言うと、
lengthやlinesなどがそのまま完全に機械語に変換されている訳ではない。
いわば中間コードのような形でプログラムがデータ化されている。
まず、その中間コードを「弱頭部正規形」という形に簡約する。
そうすると中間コードの頭の部分だけ明確になって評価可能状態になるから評価する。
で、その頭の部分を評価してるときに、中間コードの残りの部分が必要になる。
必要になったら、また残りの部分を「弱頭部正規形」に簡約し、頭を評価する。
当然、if や case of などので分岐するから、中間コードと言っても、
一列に数珠繋ぎのようになっているわけではない。
またグラフで管理してて、一度簡約した関数は再び簡約処理することは無いし、
本当はもう少し効率よくやってるが、イメージとしてはこんな感じ。
必要なら弱頭部正規形 --> 評価 --> 必要なら弱頭部正規形 --> 評価 --> ・・・
これを繰り返てプログラムを実行することで、遅延評価を実現している。
■ このスレッドは過去ログ倉庫に格納されています