Sì, vengono valutati solo gli elementi necessari per calcolare l'elemento in questione.
GHCi offre i comandi di debug :sprint
e :print
che possono fornire alcune informazioni su quali parti di un valore sono già state valutate.
Su questo esempio:
GHCi> :sprint pascal
pascal = _
(Ecco perché nulla è stato valutato a questo punto, e thunk sono mostrati come _
.)
GHCi> pascal !! 5 !! 5
1
(non sto usando 50
perché poi questo esempio diventerebbe troppo lungo.)
GHCi> :sprint pascal
pascal = [1] : [_,1] : [_,_,1] : [_,_,_,1] : [_,_,_,_,1] :
(_ : _ : _ : _ : _ : 1 : _) : _
Ora si ottiene un idea abbastanza chiara quali parti sono state guardate.
Proviamo un altro:
GHCi> pascal !! 5 !! 4
5
GHCi> :sprint pascal
pascal = [1] : [1,1] : [_,2,1] : [_,_,3,1] : [_,_,_,4,1] :
(_ : _ : _ : _ : 5 : 1 : _) : _
E un altro:
GHCi> pascal !! 10 !! 5
252
GHCi> :sprint pascal
pascal = [1] : [1,1] : [1,2,1] : [1,3,3,1] : [1,4,6,4,1] :
(1 : 5 : 10 : 10 : 5 : 1 : _) :
(_ : 6 : 15 : 20 : 15 : 6 : _) :
(_ : _ : 21 : 35 : 35 : 21 : _) :
(_ : _ : _ : 56 : 70 : 56 : _) :
(_ : _ : _ : _ : 126 : 126 : _) :
(_ : _ : _ : _ : _ : 252 : _) : _
sì - questo creerà tutte le thunk fino al '!! 50 !! 50' e valuta quelli necessari per calcolare questa voce. – Carsten
In GHCi, prova ': sprint pascal' dopo aver valutato una posizione particolare, come' pascal !! 50 !! 50', e puoi vedere cosa è stato valutato e cosa non è stato. – kosmikus
@kosmikus +1 - dovresti fare una risposta! - Se includi l'output (o uno screenshot) sarà ancora più impressionante - sto pensando di stamparlo e appenderlo sulla mia board in questo momento ("hey cos'è questo?" - <> - ".... oh "): D –
Carsten