0

给定以下代码:

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”。这里发生了什么?

4

2 回答 2

4

你有什么版本的 F#?这听起来可能像是一个已修复的错误。当 FSI 打印 Lazy<'a> 类型的值时,有时我认为 ToString() 显示用于强制惰性打印它的值,而现在它没有。

于 2010-01-13T20:15:37.933 回答
0

问题似乎是一个实现细节。Lazy 引用如何知道它何时计算了一个值?也许当它的参考不是()。

有一个类型Lazy<unit>没有多大意义。尝试

let bar =
    lazy(
        printfn "bar"        
        42)
于 2010-01-13T21:09:54.163 回答