F#: estranhidade com avaliação preguiçosa
-
20-09-2019 - |
Pergunta
Dado o seguinte código:
let bar =
lazy(
printfn "bar"
())
let foo =
lazy(
printfn "foo"
bar)
Na janela interativa (redefinindo -a a cada vez),
Quando eu ligo let res = foo.Force ()
Eu recebo:
foo
val res : Lazy<unit> = Value is not created.
Quando eu apenas ligo foo.Force()
, Eu recebo:
foo
bar
val it : Lazy<unit> =
<ToString exception: Object reference not set to an instance of an object.>
{IsValueCreated = false;
Value = null;}
Nos dois casos, eu esperava que ele imprimisse "Foo", no entanto, o segundo caso imprime "Foo nBar". O que está acontecendo aqui?
Solução
Qual versão do F# você tem? Isso parece talvez um bug corrigido; Quando o FSI imprime um valor do tipo preguiçoso <'a>, em algum momento eu acho que o toString () exibir o valor usado para forçar o preguiçoso a imprimi -lo, enquanto agora não.
Outras dicas
O problema parece ser um detalhe de implementação. Como a referência preguiçosa sabe quando calculou um valor? Talvez quando a referência não seja ().
Tendo um tipo Lazy<unit>
não faz muito sentido. Tentar
let bar =
lazy(
printfn "bar"
42)