懒惰评估简介

大多数编程语言(包括 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()