遅延評価
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2024/07/28 02:42 UTC 版)
![]() |
この記事は検証可能な参考文献や出典が全く示されていないか、不十分です。(2014年9月)
|
![]() |
この記事の正確性に疑問が呈されています。
|
![]() |
この記事の内容の信頼性について検証が求められています。
|
遅延評価(ちえんひょうか、英: lazy evaluation)や必要呼び(ひつようよび、英: call-by-need)は評価戦略の一種類であり、非正格な関数型言語で使用もされる。対義語は先行評価(英: eager evaluation)。
概要
評価しなければならない値が存在するとき、実際の計算を値が必要になるまで行わないことをいう。評価法が指示されているが実際の計算が行われていない中間状態の時それをプロミス(英: promise)や、計算の実体をさしてサンク(英: thunk)といい、プロミスを強制(英: force)することで値が計算される。一旦計算された値はキャッシュをすることが可能であり、遅延プロミスは最大で一度しか計算されないようにすることができる。ただし、Haskell の実装によっては、何度でも同じ計算を行う。
ある関数を呼び出すとき、その関数が引数の全てを利用するとは限らない。条件次第で捨ててしまうような値を事前に準備することは非効率的である。このような場合遅延評価を行うと必要なときだけ値が計算されるので計算量を低減できる。
また同じ評価を複数回利用する可能性があるとき、先行評価では値を保持しない限りそれぞれのケースで再計算を行うが、遅延評価では実評価は最初の一度だけで二回目以降はキャッシュを参照するだけであることが保証されている[要検証 ]為、自然な形で値の再利用を実現できる。
一方で遅延評価は実装の難しさ、計算が起こるタイミングを予想できないという弱点を持つ。現行計算機のアーキテクチャでは先行評価が機械的に自然なこともあり、普及するには時間が必要である。
遅延評価を持つ言語
遅延評価を原則とする言語の例
遅延評価を仕様に定義している言語の例
関連項目
遅延評価
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/11/20 02:06 UTC 版)
Haskell は遅延評価を基本的な評価戦略とする。ほとんどの言語では関数の呼び出しにおいて引数に与えられたすべての式を評価してから呼び出された関数に渡す先行評価を評価戦略とするが、これに対し Haskell ではあらゆる式はそれが必要になるまで評価されない。次の定数 answer は評価すると常に 42 を返すが、その定義には未定義の式を含む。 answer = const 42 (1 `div` 0) ここで、const は常に第1引数を返す定数関数である。また、`div` は整数の除算を行う演算子であり、1 `div` 0 は 1 / 0 に相当し、この値は未定義であり、この部分を評価すればエラーになる。正格評価をする言語でこのような式を評価しようとすると、ゼロ除算によるエラーになるであろう。しかし 上記の定数 answer を評価してもエラーにはならない。const は第1引数をつねに返すので第2引数を評価する必要はなく、第2引数に与えられた式 1 `div` 0 は無視されるので評価されないからである。遅延評価がデフォルトで行われることにより、不要な計算は省かれ、参照透過性により同じ式を複数回評価する必要もなくなるため、Haskell では最適化によって計算効率の向上が期待できる場合がある。ただし、頻繁に新たな値を計算する場合は正格評価のほうが効率がよく、必要に応じてseq関数やBangPatterns拡張による明示により正格評価もできる。
※この「遅延評価」の解説は、「Haskell」の解説の一部です。
「遅延評価」を含む「Haskell」の記事については、「Haskell」の概要を参照ください。
遅延評価と同じ種類の言葉
- 遅延評価のページへのリンク