Tak, obliczane są tylko te elementy, które są wymagane do obliczenia danego elementu.
GHCi oferuje komendy debugowania :sprint
i :print
, które mogą dostarczyć informacji o tym, które części wartości zostały już ocenione.
Na tym przykładzie:
GHCi> :sprint pascal
pascal = _
(To dlatego, że nic nie zostało ocenione w tym momencie, a łącznikami są pokazane jako _
.)
GHCi> pascal !! 5 !! 5
1
(nie używam 50
bo wtedy ten przykład stałby się zbyt długi.)
GHCi> :sprint pascal
pascal = [1] : [_,1] : [_,_,1] : [_,_,_,1] : [_,_,_,_,1] :
(_ : _ : _ : _ : _ : 1 : _) : _
Teraz masz całkiem jasny pomysł, na które części zostały spojrzane.
Spróbujmy jeszcze jeden:
GHCi> pascal !! 5 !! 4
5
GHCi> :sprint pascal
pascal = [1] : [1,1] : [_,2,1] : [_,_,3,1] : [_,_,_,4,1] :
(_ : _ : _ : _ : 5 : 1 : _) : _
a drugi:
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 : _) : _
tak - to stworzy Ci wszystkie łącznikami aż do '!! 50 !! 50' i oceń te, które są potrzebne do obliczenia tego wpisu. – Carsten
W GHCi, spróbuj ': sprint pascal' po dokonaniu oceny konkretnej lokalizacji, np.' Pascal !! 50 !! 50' i możesz zobaczyć, co zostało ocenione, a co nie. – kosmikus
@kosmikus +1 - powinieneś zrobić to odpowiedź! - Jeśli dodasz wyjście (lub zrzut ekranu), będzie to jeszcze bardziej imponujące - myślę o wydrukowaniu tego i powieszeniu go na mojej tablicy ("hej, co to jest?" - <> - ".... oh "): D –
Carsten