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 ()
使用 .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 ()