2010-01-13 5 views
0

Vu le code suivant:F #: Oddity avec évalution paresseux

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

let foo = 
    lazy(
     printfn "foo" 
     bar) 

Dans la fenêtre interactive (remise à zéro chaque fois),

Quand j'appelle let res = foo.Force() je reçois:

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

Quand j'appelle simplement foo.Force(), j'obtiens:

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

Dans les deux cas, je m'attendais à juste imprimer "foo", mais le deuxième cas imprime "foo \ nbar". Que se passe t-il ici?

Répondre

4

Quelle version de F # avez-vous? Cela ressemble peut-être à un bug qui a été corrigé; quand FSI imprime une valeur de type Lazy < 'a>, je pense que ToString() à un moment donné, affichera la valeur utilisée pour forcer le lazy à l'imprimer, alors que maintenant ce n'est pas le cas.

+0

Cela pourrait être, je pense que mon VS2010 beta2 est assez vieux: 10.0.21003.1. Est-ce que quelqu'un d'autre reproches ce problème? Sinon, je suppose que c'est un problème connu avec les versions précédentes – rysama

+0

Ouais, je n'ai pas Beta2 à portée de main, mais ma construction interne au travail a le comportement attendu, donc cela semble avoir été un bug qui a été corrigé, Je ne sais pas si le correctif l'avait déjà fait dans une version ou non. – Brian

+0

Merci de vérifier – rysama

0

Le problème semble être un détail d'implémentation. Comment la référence Lazy sait-elle quand elle a calculé une valeur? Peut-être que quand ce n'est pas la référence().

Avoir un type Lazy<unit> n'a pas beaucoup de sens. Essayez

let bar = 
    lazy(
     printfn "bar"   
     42)