给出以下代码:
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”。这是怎么回事?
答案 0 :(得分:4)
你有什么版本的F#?这听起来像是一个被修复的错误;当FSI打印一个类型为Lazy&lt;'a&gt;的值时,我认为ToString()显示用于强制延迟打印它的值,而现在它没有。
答案 1 :(得分:0)
问题似乎是一个实现细节。惰性引用如何知道它何时计算出值?也许当它的引用不是()时。
拥有Lazy<unit>
类型没有多大意义。尝试
let bar =
lazy(
printfn "bar"
42)