Поиск…


Ленивая оценка

Большинство языков программирования, включая F #, оценивают вычисления немедленно в соответствии с моделью под названием Strict Evaluation. Однако в Lazy Evaluation вычисления не оцениваются до тех пор, пока они не понадобятся. F # позволяет использовать ленивую оценку как по lazy ключевому слову, так и по sequences .

// define a lazy computation
let comp = lazy(10 + 20)

// we need to force the result
let ans = comp.Force()

Кроме того, при использовании Lazy Evaluation результаты вычисления кэшируются, поэтому, если мы вынуждаем результат после нашего первого экземпляра принудительного его применения, само выражение не будет оцениваться снова

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

Введение в ленивую оценку в F #

F #, как и большинство языков программирования, по умолчанию использует Strict Evaluation. При строгой оценке вычисления выполняются немедленно. Напротив, Lazy Evaluation, откладывает выполнение вычислений до тех пор, пока их результаты не будут необходимы. Более того, результаты вычисления в рамках «ленивой оценки» кэшируются, тем самым устраняя необходимость переоценки выражения.

Мы можем использовать оценку Lazy в F # через как lazy ключевое слово, так и 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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow