Если вы используете ключевое слово 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