遅延評価
表示
この記事の正確性に疑問が呈されています。 |
この記事の内容の信頼性について検証が求められています。 |
遅延評価(ちえんひょうか、英: lazy evaluation)や必要呼び(ひつようよび、英: call-by-need)は評価戦略の一種類であり、非正格な関数型言語で使用もされる。対義語は先行評価(英: eager evaluation)。
概要
[編集]評価しなければならない値が存在するとき、実際の計算を値が必要になるまで行わないことをいう。評価法が指示されているが実際の計算が行われていない中間状態の時それをプロミス(英: promise)や、計算の実体をさしてサンク(英: thunk)といい、プロミスを強制(英: force)することで値が計算される。一旦計算された値はキャッシュをすることが可能であり、遅延プロミスは最大で一度しか計算されないようにすることができる。ただし、Haskell の実装によっては、何度でも同じ計算を行う。
ある関数を呼び出すとき、その関数が引数の全てを利用するとは限らない。条件次第で捨ててしまうような値を事前に準備することは非効率的である。このような場合遅延評価を行うと必要なときだけ値が計算されるので計算量を低減できる。
また同じ評価を複数回利用する可能性があるとき、先行評価では値を保持しない限りそれぞれのケースで再計算を行うが、遅延評価では実評価は最初の一度だけで二回目以降はキャッシュを参照するだけであることが保証されている[要検証 ]為、自然な形で値の再利用を実現できる。
一方で遅延評価は実装の難しさ、計算が起こるタイミングを予想できないという弱点を持つ。現行計算機のアーキテクチャでは先行評価が機械的に自然なこともあり、普及するには時間が必要である。