A causa della pigrizia (più la limitazione del monomorfismo e del pugnale;). Fondamentalmente, quando si dice
year = year + 1
e poi valutare year
, Haskell consente di risparmiare spazio per il risultato, e poi quando si vede year
si cerca di riutilizzare lo stesso risultato. Pertanto, quando year + 1
prova a valutare year
, il codice per year
non viene effettivamente inserito.
In GHC, per implementare multi-threading & ddagger;, ciò che effettivamente fa è bloccare il thread corrente quando tenta di ottenere il valore di una variabile che è già in fase di valutazione. Quindi, al termine della valutazione, riprende l'esecuzione del thread bloccato. In questo caso, il thread viene bloccato su una valutazione che sta eseguendo, motivo per cui si ottiene un deadlock.
Se invece dici
year() = year() + 1
poi correre year()
dà un overflow dello stack per me.
e pugnale; La restrizione monomorfismo entra in gioco, perché se si aggiunge una firma di tipo
year :: Num a => a
year = year + 1
il compilatore è perfettamente libero di trattare il Num a
dizionario come il parametro ()
, ottenendo un overflow dello stack. In questo caso non è un problema, ma non memorizzare i risultati intermedi nella cache è un grosso problema nei calcoli reali. In questo caso, sembra che GHC è in realtà mettendo la ricorsione all'interno l'astrazione sopra il dizionario, produrre codice più come
year() = let y = y + 1 in y
che pure non produce un overflow dello stack.
& ddagger; compilazione del codice (con GHC) in modalità single-threaded cede
<<loop>>
che significa GHC rilevato il ciclo infinito e deciso di lamentarsi.
Guarda l'utilizzo della memoria. Dipende dalle ottimizzazioni, ma questa è una cosa che può accadere. – luqui
Qual è l'output presunto? –
Immagino che il risultato di questo non sia definito. –