F#:懒惰评价的奇怪

问题描述 投票:0回答:2

给出以下代码:

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# lazy-evaluation f#-interactive
2个回答
4
投票

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


0
投票

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

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

let bar =
    lazy(
        printfn "bar"        
        42)
© www.soinside.com 2019 - 2024. All rights reserved.