Lazy<'T> 与匿名函数

Lazy<'T> vs anonymous functions

使用 .NET 惰性运算符而不是普通函数有什么优势吗?

例如:

let x = lazy ...
let y = lazy (1 + x.Value)

let x = (fun () -> ...)
let y = (fun () -> 1 + x())

惰性值和函数之间的区别在于惰性值只计算一次。然后它缓存结果并再次访问它不会重新计算该值。每次调用函数都会对其进行评估。

这对性能有影响,而且当你有副作用时它也很重要。例如,以下仅打印一次 "calculating x"

let x = lazy (printfn "calculating x"; 1)
let y = lazy (1 + x.Value)
y.Value + y.Value

以下打印 "calculating x" 两次:

let x = (fun () -> printfn "calculating x"; 1)
let y = (fun () -> 1 + x())
y () + y ()