遅延評価

提供: miniwiki
移動先:案内検索


遅延評価(ちえんひょうか、: lazy evaluation)や必要呼び(ひつようよび、: call-by-need)は評価戦略の一種類であり、非正格な関数型言語で使用もされる。対義語は先行評価: eager evaluation)。

概要

評価しなければならない値が存在するとき、実際の計算を値が必要になるまで行わないことをいう。評価法が指示されているが実際の計算が行われていない中間状態の時それをプロミス(: promise)や、計算の実体をさしてサンク(: thunk)といい、プロミスを強制(: force)することで値が計算される。一旦計算された値はキャッシュをすることが可能であり、遅延プロミスは最大で一度しか計算されないようにすることができる。ただし、Haskell の実装によっては、何度でも同じ計算を行う。

遅延評価を行う利点は計算量最適化である。

ある関数を呼び出すとき、その関数が引数の全てを利用するとは限らない。条件次第で捨ててしまうような値を事前に準備することは非効率的である。このような場合遅延評価を行うと必要なときだけ値が計算されるので計算量を低減できる。

また同じ評価を複数回利用する可能性があるとき、先行評価では値を保持しない限りそれぞれのケースで再計算を行うが、為、自然な形で値の再利用を実現できる。

一方で遅延評価は実装の難しさ、計算が起こるタイミングを予想できないという弱点を持つ。現行計算機のアーキテクチャでは先行評価が機械的に自然なこともあり、普及するには時間が必要である。

遅延評価を持つ言語

遅延評価を原則とする言語の例

遅延評価を仕様に定義している言語の例

関連項目