2017-03-10 1 views
0

den Code Haskell Auswertung hier:Verzögerte Auswertung in Haskell mit zipWith und zwei unendliche Listen

lazee = 0 : zipWith (+) (map (+1) lazee) (map (2*) lazee) 

und dann take 5 lazee Aufruf ergibt dieses Ergebnis:

[0,1,4,13,40] 

Ich verstehe nicht, in welcher Reihenfolge Die obigen Funktionen werden ausgewertet. Sie sind unendliche Listen und ich habe ein bisschen Mühe, meinen Kopf darum zu wickeln. Folglich bin ich mir nicht sicher, wie Haskell dieses Ergebnis erhalten hätte.

+0

Sie können sich eine Reihe mit 'a [n + 1] = (a [n] +1) + (2 * a [n])' denken, beginnend mit 'a [0] = 0', was ist äquivalent zu '3a [n] + 1'. – karakfa

+0

@karakfa Macht Sinn, thx =) –

Antwort

2

Es funktioniert ungefähr so ​​

lazee = 0 : lazee1 
lazee1 = zipWith (+) (map (+1) lazee) (map (2*) lazee) 

daher

lazee = 0 : lazee1 
lazee1 = zipWith (+) (map (+1) (0:lazee1)) (map (2*) (0:lazee1)) 

aber map (+1) (0:lazee1) ist 1 : map (+1) lazee1. Ähnlich für die anderen map. Deshalb

lazee = 0 : lazee1 
lazee1 = zipWith (+) (1 : map (+1) lazee1) (0 : map (2*) lazee1) 

Jetzt weiß zipWith die ersten Elemente und (+) 1 0 berechnen kann. Wir bekommen

lazee = 0 : lazee1 
lazee1 = 1 : lazee2 
lazee2 = zipWith (+) (map (+1) lazee1) (map (2*) lazee1) 

nun die gleichen Schritte wiederholen, wie oben:

lazee2 = zipWith (+) (map (+1) (1:lazee2)) (map (2*) (1:lazee2)) 
     = zipWith (+) (2 : map (+1) lazee2) (2 : map (2*) lazee2) 
     = 4 : zipWith (+) (map (+1) lazee2) (map (2*) lazee2) 

Und so weiter.

Verwandte Themen