2014-11-04 2 views
17

Wenn ich diese Konstante pascal alsWie viel von Pascal's Dreieck wird dies bewerten?

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

definiert haben, und ich bewerten pascal !! 50 !! 50 in GHCI, wie viel von dem Dreieck tut dies evaulate? Bedeutet diese Faulheit, dass nur die notwendigen Werte (plus eine Menge Thunks) berechnet werden?

+1

ja - das Sie alle Thunks bis zum 'schaffen !! 50 !! 50 'und werte die benötigten aus, um diesen Eintrag zu berechnen. – Carsten

+7

In GHCi, versuchen Sie ': sprint pascal' nach der Bewertung eines bestimmten Ortes, wie' Pascal !! 50 !! 50', und Sie können sehen, was evaluiert wurde und was nicht. – kosmikus

+2

@kosmikus +1 - Sie sollten dies eine Antwort geben! - Wenn du die Ausgabe (oder einen Screenshot) eingibst, wird es noch beeindruckender sein - ich denke darüber nach, dies auszudrucken und es gerade auf mein Board zu hängen ("hey was ist das?" - <> - ".... oh "): D – Carsten

Antwort

25

Ja, nur die Elemente, die zur Berechnung des betreffenden Elements benötigt werden, werden ausgewertet.

GHCi bietet die Debugging-Befehle :sprint und :print an, die Ihnen Informationen darüber geben können, welche Teile eines Werts bereits ausgewertet wurden.

An diesem Beispiel:

GHCi> :sprint pascal 
pascal = _ 

(Das ist, weil nichts an dieser Stelle ausgewertet wurde und Thunks als _ gezeigt.)

GHCi> pascal !! 5 !! 5 
1 

(Ich verwende 50 nicht, weil dann Dieses Beispiel würde zu lang werden.)

GHCi> :sprint pascal 
pascal = [1] : [_,1] : [_,_,1] : [_,_,_,1] : [_,_,_,_,1] : 
     (_ : _ : _ : _ : _ : 1 : _) : _ 

Jetzt erhalten Sie ein ziemlich klare Vorstellung, welche Teile angeschaut wurden.

ist ein Lassen Sie versuchen, mehr:

GHCi> pascal !! 5 !! 4 
5 
GHCi> :sprint pascal 
pascal = [1] : [1,1] : [_,2,1] : [_,_,3,1] : [_,_,_,4,1] : 
     (_ : _ : _ : _ : 5 : 1 : _) : _ 

Und noch eins:

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