Szukaj…
Leniwa ocena Wprowadzenie
Większość języków programowania, w tym F #, ocenia obliczenia natychmiast zgodnie z modelem zwanym Ocena ścisła. Jednak w Lazy Evaluation obliczenia nie są oceniane, dopóki nie są potrzebne. F # pozwala nam korzystać z leniwej oceny zarówno przez lazy
słowo kluczowe, jak i sequences
.
// define a lazy computation
let comp = lazy(10 + 20)
// we need to force the result
let ans = comp.Force()
Ponadto podczas korzystania z Lazy Evaluation wyniki obliczeń są buforowane, więc jeśli wymuszymy wynik po pierwszym wystąpieniu jego wymuszenia, samo wyrażenie nie zostanie ponownie ocenione
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()
Wprowadzenie do leniwej oceny w F #
F #, podobnie jak większość języków programowania, domyślnie używa oceny ścisłej. W ocenie ścisłej obliczenia są wykonywane natychmiast. Natomiast Lazy Evaluation odracza wykonywanie obliczeń, dopóki ich wyniki nie będą potrzebne. Co więcej, wyniki obliczeń w ramach Lazy Evaluation są buforowane, co eliminuje potrzebę ponownej oceny wyrażenia.
Możemy użyć oceny Lazy w F # zarówno przez lazy
słowo kluczowe, jak i Sequences
// 23 * 23 is not evaluated here
// lazy keyword creates lazy computation whose evaluation is deferred
let x = lazy(23 * 23)
// we need to force the result
let y = x.Force()
// Hello World not printed here
let z = lazy(printfn "Hello World\n"; 23424)
// Hello World printed and 23424 returned
let ans1 = z.Force()
// Hello World not printed here as z as already been evaluated, but 23424 is
// returned
let ans2 = z.Force()