質問

次のコードを考えます

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#のバージョンは何がありますか?これは多分、固定しまったバグのように聞こえます。 FSIは、タイプのLazy の値を出力したときに、いくつかの点で私は、ToStringメソッドを考えて()、今それがないのに対し、それを印刷するために怠惰を強制するために使用される値を表示します。

他のヒント

問題は、実装の詳細であるように思われます。それは値を計算したときにどのように怠惰な参照が知っているのですか?それは言及がないですたぶんとき()。

Lazy<unit>を持つことは、あまり意味がありません。試してみてください。

let bar =
    lazy(
        printfn "bar"        
        42)
scroll top