遅延評価とは、式を必要になるまで計算しないことである。
概要
プログラミングにおいて式は出てきた時点で計算されることが多いが、それをあえて実際に必要になるまで計算しないでおくことを遅延評価という。英語ではLazy Evaluation、怠け者なのである。反対語は正格評価(Eager Evaluation)、実行中のソースコード上に現れた時点で計算を行う方式である。
大半のプログラミング言語での処理原則は正格評価である。
要件
遅延評価を実現するためには、計算に必要な値が実際に評価されるまでに変化しない、すなわち参照透過であることが求められる。計算に用いる値が実際に計算するまでに変更されることがあれば、当然計算結果も違ったものになるからである。
計算に用いる値が、計算が必要になった時に適切な値に変化するように設計されていれば、参照透過性は必要ないのかもしれないが、言語仕様でそのような適切性を確保するのはほぼ不可能なので、現実には遅延評価の実装部分には必ず参照透過性が求められる。
利点
通常、関数の引数は関数に渡されるときに計算されるが、遅延評価では関数に渡した後、実際に計算が必要になるまで評価されない。
無限リストがこの利点を説明するためによく引き合いに出される。無限リストを評価するということは、無限リストの「全ての」要素を計算するということであるが、これは当然無限個の処理が終わるはずはないのでエラーになる。しかし、遅延評価における無限リストは、定義時や引数として関数に渡されたりした時もエラーにならず、関数内で請求された時に必要最低限の要素の値を返して特に問題なく動作する。
正格評価しか行えない環境では、考えうる限りで最長の長さのリストを予め作成して無限リストの代用をするという考え方もあるが、その場合、要素の大半は使用されずに廃棄されることになりパフォーマンス上の問題を生じる。遅延評価はそういった影響は受けないので、パフォーマンス上有利であるという主張がある。
欠点
計算を目的とするプログラムでは原則としてCPUはフル稼働するので上記は利点と言えるが、ユーザーからの応答を待つプログラムのように何らかの待ち時間のあるプログラムだと、応答を待ってから計算を始めるのではかえって計算が遅くなることもある。
論理演算実装との類似点(短絡評価)
遅延評価とは厳密には異なるかもしれないが、非関数型プログラミングでも論理演算には似たような機構が備わっている。
A or B のような論理演算では A が真であれば、B の真偽にかかわらず結果が真であることは確定するので、B の真偽は評価しないプログラミング言語が多い。たとえば A が「C はぬるぽである」という内容であったとすると、B に C がぬるぽであるとエラーが出るような式が書いてあっても B が計算されるのは C がぬるぽでない時に限られるので問題が起きないのである。
論理学上は A or B と B or A は等価であるはずだが、B or A であったら C がぬるぽのときはエラーになる。
このように処理の一部をショートカットして値を返す評価方法を短絡評価(short-circuit evaluation)といい、他には if文(または if式)や条件演算子でも行われる。短絡評価の対象となる項(A or B の B)が黙示的に引数なしのラムダ式になっていると考えれば一種の遅延評価と捉えることも出来る。
関連動画
必要になったらうpされると思います。
関連商品
必要になったら発売されると思います
関連コミュニティ
必要になったら作られてメンバーを募集すると思います。
関連項目
- 4
- 0pt
- ページ番号: 5383005
- リビジョン番号: 2747354
- 編集内容についての説明/コメント: