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?

Foi útil?

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top