给出以下代码:
let bar =
lazy(
printfn "bar"
())
let foo =
lazy(
printfn "foo"
bar)
在交互式窗口中(每次重置),
当我打电话给let res = foo.Force ()
时,我得到:
foo
val res : Lazy<unit> = Value is not created.
当我打电话给foo.Force()
时,我得到:
foo
bar
val it : Lazy<unit> =
<ToString exception: Object reference not set to an instance of an object.>
{IsValueCreated = false;
Value = null;}
在这两种情况下,我都希望它只打印“foo”,但第二种情况打印“foo \ nbar”。这里发生了什么?
你有什么版本的F#?这听起来像是一个被修复的错误;当FSI打印一个类型为Lazy <'a>的值时,在某些时候我认为ToString()显示用于强制延迟打印它的值,而现在却没有。
这个问题似乎是一个实现细节。惰性引用如何知道它何时计算出值?也许当它的引用不是()时。
有一个类型Lazy<unit>
没有多大意义。尝试
let bar =
lazy(
printfn "bar"
42)