サーチ…


レイジー評価の紹介

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