首先,它可能是有益的注意,所有已定義的東西是一個功能 - 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