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 : _) : _
ja - das Sie alle Thunks bis zum 'schaffen !! 50 !! 50 'und werte die benötigten aus, um diesen Eintrag zu berechnen. – Carsten
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
@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