首先,它可能是有益的注意,所有已定义的东西是一个功能 - eagerFunc
和theValue
是类型的值int
和lazyFunc
是Lazy<int>
类型的值。鉴于
let lazyTwo = lazy (1 + 1)
和
let eagerTwo = 1 + 1
表达1 + 1
将不评估一次以上,无论你有多少次使用eagerTwo
。所不同的是1 + 1
将被评估恰好一次时限定eagerTwo
,但将被评估至多一次时lazyTwo
是使用(它会在第一时间被评价为Value
属性被访问,并然后缓存以便进一步使用Value
不需要重新计算它)。如果lazyTwo
的Value
从未访问,那么它的身体1 + 1
将永远进行评估。
通常情况下,在F#等严格语言中使用惰性值时看不到太多好处。由于访问Value
属性需要检查值是否已经计算,因此它们会添加少量开销。如果您有类似let lazyValue = lazy someVeryExpensiveCalculationThatMightNotBeNeeded()
的东西,它们可能会为您节省一些计算费用,因为只有在实际使用该值时才会发生昂贵的计算。他们也可以使一些算法终止,否则不会,但这不是F#中的主要问题。例如:
// throws an exception if x = 0.0
let eagerDivision x =
let oneOverX = 1.0/x
if x = 0.0 then
printfn "Tried to divide by zero" // too late, this line is never reached
else
printfn "One over x is: %f" oneOverX
// succeeds even if x = 0.0, since the quotient is lazily evaluated
let lazyDivision x =
let oneOverX = lazy (1.0/x)
if x = 0.0 then
printfn "Tried to divide by zero"
else
printfn "One over x is: %f" oneOverX.Value
来源
2011-07-13 18:48:51
kvb
这是什么版本的F#?我有一个懒惰行事的序列,但并没有公开这样创建。我试图强制它完成。 – octopusgrabbus