代码之家  ›  专栏  ›  技术社区  ›  rysama

F:带有懒惰评价的古怪

  •  0
  • rysama  · 技术社区  · 15 年前

    给出以下代码:

    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 回复  |  直到 6 年前
        1
  •  4
  •   Brian    15 年前

    你有什么版本的F?这听起来像是一个修正了的错误;当fsi打印lazy<'a>类型的值时,我认为toString()会显示用于强制lazy打印它的值,而现在它不会。

        2
  •  0
  •   Ray    15 年前

    这个问题似乎是一个实现细节。lazy引用如何知道它何时计算了一个值?可能当它的引用不是()时。

    有类型的 Lazy<unit> 没什么意义。尝试

    let bar =
        lazy(
            printfn "bar"        
            42)