F # noob, помогите понять Lazy and Value - PullRequest
1 голос
/ 04 августа 2011

Я только начинаю F # и на самом деле не занимался функциональным программированием со времени моего класса языков программирования 15 лет назад (за исключением «современного» C #).

Я смотрю на этот фрагмент F # с помощью LINQPad 4:

let add x y = x + y

let lazyPlusOne x = lazy add x 1
let e = lazyPlusOne 15
Dump e

let plusOne x = add x 1
let f = plusOne 15
Dump f

Выходная информация:

Lazy<Int32>  
  Value is not created. 
  IsValueCreated False
  Value 16

16

Я понимаю ленивое ключевое слово для отсрочки оценки до необходимого, так же, как в C # отложенное выполнение.

Что означает здесь: «Ценность не создается»?

Ответы [ 2 ]

3 голосов
/ 04 августа 2011

Если вы используете ключевое слово lazy для создания ленивого значения (как в вашей функции lazyPlusOne), то результатом будет значение типа Lazy<int>.Это представляет значение типа int, которое оценивается только тогда, когда это действительно необходимо.

Я предполагаю, что функция Dump пытается распечатать значение, включая все его свойства - когда она начинает печатать, значениене оценивается, поэтому ToString метод печатает Value is not created. Затем он перебирает другие свойства, и когда он обращается к Value, вычисляется ленивое значение (потому что его значение теперь необходимо).После оценки свойство возвращает значение 16, которое затем печатается.

Вы можете заменить Dump функцией печати, дружественной к F # (или просто использовать F # Interactive, что чрезвычайно удобно для воспроизведения с F # внутри VisualStudio с обычной IntelliSense, проверкой фоновых ошибок etec.)

F # -дружественная функция печати, такая как printfn "%A", не имеет доступа к свойству Value, поэтому она не может случайно оценить значение.Вот фрагмент из F # Interactive:

> let a = lazy (1 + 2);;
val a : Lazy<int> = Value is not created. // Creates lazy value that's not evaluated

> a;;
val it : Lazy<int> = Value is not created. // Still not evaluated!

> a.Value;; // Now, the lazy value needs to be evaluated (to get the Value)
val it : int = 3

> a;;     // After evaluation, the value stays cached
val it : Lazy<int> = 3 
0 голосов
/ 04 августа 2011

По состоянию на 'Dump e', 'lazyPlusOne 15' не был оценен. «Let e ​​= lazyPlusOne 15» не требует оценки «lazyPlusOne 15». Нам еще не нужно знать, что он оценивает. Дамп вызывает оценку, и это семантически отличается от простого сброса значения после оценки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...