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()


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow