2014-11-04 4 views
17

Se ho questa costante pascal definito comeQuanto vale il triangolo di Pascal?

pascal :: [[Int]] 
pascal = iterate newrow [1] 
    where newrow = (zipWith (+) <*> tail) . ([0]++) . (++[0]) 

E io valutare pascal !! 50 !! 50 in GHCI, quanto del triangolo fa questo evaulate? Questa pigrizia significa solo calcolare i valori necessari (più un mucchio di thunk)?

+1

sì - questo creerà tutte le thunk fino al '!! 50 !! 50' e valuta quelli necessari per calcolare questa voce. – Carsten

+7

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

+2

@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

risposta

25

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 : _) : _