Sono abbastanza nuovo per Haskell e sto cercando di capire come funziona l'espressione pigra delle sequenze di Fibonacci.Haskell Fibonacci Spiegazione
So che questo è stato chiesto prima, ma nessuna delle risposte ha risolto un problema che sto riscontrando nel visualizzare il risultato.
Il codice è quella canonica utilizzando zipWith
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
ho capito quanto segue:
zipWith
cerniere letteralmente due liste insiemetail
palio tutti, ma il primo elemento di una lista- I riferimenti Haskell 'to-be' dati calcolati come
thunks
.
Dalla mia comprensione, in primo luogo aggiunge [0,1,<thunk>]
e [1,<thunk>]
utilizzando zipWith (+)
per dare [1,<thunk>]
. Così ora avete
fibs = 0 : 1 : 1 : zipWith (+) fibs (tail fibs)
Un sacco di riferimenti Googled hanno poi proceduto a "visualizzare" la riga sopra come
fibs = 0 : 1 : 1 : zipWith (+) [1,1,<thunk>] ([1,<thunk>]).
mia domanda è questa:
Perché è lafibs
componente nella riga sopra solo corrispondente a[1,1,<thunk>]
anziché[0,1,1,<thunk>]
?
Non dovrebbe fibs
contenere l'intero elenco più <thunk>
?
buon modo per comprendere tali definizioni è quello di [nome dei valori intermedi] (http://stackoverflow.com/a/20978114/849891) che entrano in esistenza come abbiamo progressivamente loro l'accesso (ad esempio, in 'prendere 3 fibs'). In questo modo non c'è confusione tra lo stesso pezzo di dati a cui si accede due volte (attraverso lo stesso nome), o due pezzi di dati uguali (ognuno con il proprio nome). –