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」と出力されることを期待していましたが、2 番目のケースでは「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 に答える