懶惰評估簡介

大多數程式語言(包括 F#)都會根據稱為嚴格評估的模型立即評估計算。但是,在 Lazy Evaluation 中,計算直到需要時才會進行評估。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()