サーチ…
レイジー評価の紹介
F#を含むほとんどのプログラミング言語は、厳密な評価と呼ばれるモデルに従って計算を直ちに評価します。ただし、レイジー評価では、計算が必要になるまで評価されません。 F#では、 lazy
キーワードとsequences
両方で遅延評価を使用できます。
// define a lazy computation
let comp = lazy(10 + 20)
// we need to force the result
let ans = comp.Force()
さらに、Lazy Evaluationを使用すると、計算結果がキャッシュされるので、最初の強制実行後に結果を強制すると、式自体は再度評価されません
let rec factorial n =
if n = 0 then
1
else
(factorial (n - 1)) * n
let computation = lazy(printfn "Hello World\n"; factorial 10)
// Hello World will be printed
let ans = computation.Force()
// Hello World will not be printed here
let ansAgain = computation.Force()
F#でのレイジー評価の概要
F#は、ほとんどのプログラミング言語と同様、Strict Evaluationをデフォルトで使用します。厳密な評価では、計算はすぐに実行されます。対照的に、Lazy Evaluationは、結果が必要になるまで計算の実行を延期します。さらに、レイジー評価の計算結果はキャッシュされ、式の再評価の必要性が排除されます。
lazy
キーワードとSequences
両方を使ってF#で遅延評価を使うことができます
// 23 * 23 is not evaluated here
// lazy keyword creates lazy computation whose evaluation is deferred
let x = lazy(23 * 23)
// we need to force the result
let y = x.Force()
// Hello World not printed here
let z = lazy(printfn "Hello World\n"; 23424)
// Hello World printed and 23424 returned
let ans1 = z.Force()
// Hello World not printed here as z as already been evaluated, but 23424 is
// returned
let ans2 = z.Force()
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow