F#:懒惰评价的奇怪

时间:2010-01-13 19:40:14

标签: f# lazy-evaluation f#-interactive

给出以下代码:

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”。这是怎么回事?

2 个答案:

答案 0 :(得分:4)

你有什么版本的F#?这听起来像是一个被修复的错误;当FSI打印一个类型为Lazy&lt;'a&gt;的值时,我认为ToString()显示用于强制延迟打印它的值,而现在它没有。

答案 1 :(得分:0)

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

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

let bar =
    lazy(
        printfn "bar"        
        42)