Frage

Bei dem folgenden Code ein:

let bar =
    lazy(
        printfn "bar"        
        ())

let foo = 
    lazy(
        printfn "foo"
        bar)

Im interaktiven Fenster (es jedes Mal zurückzusetzen),

Als ich let res = foo.Force () nenne ich bekommen:

foo
val res : Lazy<unit> = Value is not created.

Als ich foo.Force() einfach anrufen, erhalte ich:

foo
bar
val it : Lazy<unit> =
  <ToString exception: Object reference not set to an instance of an object.>
    {IsValueCreated = false;
     Value = null;}

In beiden Fällen hätte ich erwartet, dass es hätte nur „foo“, aber die zweite Fall druckt „foo \ nbar“ drucken. Was ist denn hier los?

War es hilfreich?

Lösung

Welche Version von F # haben Sie? Das klingt vielleicht wie ein Fehler, die behoben bekam; wenn FSI druckt einen Wert vom Typ Faule < 'a>, an einem gewissen Punkt denke ich, die ToString () verwendet, um den Wert anzuzeigen, die faul zu zwingen, es zu drucken, während jetzt ist es nicht.

Andere Tipps

Das Problem scheint eine Implementierung Detail zu sein. Wie weiß der Faule Referenz, wenn es einen Wert berechnet hat? Vielleicht Referenz, wenn es nicht ().

eine Art Lazy<unit> Mit nicht viel Sinn machen. Versuchen

let bar =
    lazy(
        printfn "bar"        
        42)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top