www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheHaskell-Forum

JohnnyBGoode

Gepostet:
13.05.2011 21:22

Brauche Hilfe beim entschlüsseln von Code ( 2 Zeilen - Code für scanr)  
Kann mir jemand erklären wie genau dieser Code-Abschnitt funktioniert?

-- (Rekursive-Lösung)

scanr2 step zero [] = [zero]
scanr2 step zero (x:xs) = (step x (head prev)):prev
where prev = scanr2 step zero xs

--(Lösung mithilfe von foldr)

scanr3 step zero xs = foldr step\\\' [zero] xs
where step\\\' x xs = (step x (head xs)):xs

Ich weiß was scanr macht, aber ich weiß nicht warum dieser Code für Scanr das leistet.
(Vorallem ist mir rätselhaft, wie es dieser Code schafft, zero an das ENDE der Liste zu hängen.)

Die Lösung ist bestimmt ganz einfach, aber ich verstehe es nicht und es lässt mich nicht los!!!

Zum Seitenanfang    
 
Landei

Gepostet:
14.05.2011 13:25

   
Zu scanr2:

Beim Basisfall einer leeren Liste wird eine Liste nur mit zero zurückgegeben.
Um eine Liste zu scanr2-en, wird erst einmal die Operation nur für den Listen-Schwanz ausgeführt und prev genannt. Dieser wird als Schwanz des Ergebnisses verwendet, und gleichzeitig wird x mit dem ersten Element vom prev verknüpft und davorgehängt.

Hier ein Beispiel, wobei die Variablen jeder Stufe einen Index bekommen

scanr2 (+) 10 [1,2,3]
-> x is 1, xs = [2,3] prev ist:
scanr2 (+) 10 [2,3]
--> x1 ist 2, xs1 = [3], prev1 ist:
scanr2 (+) 10 [3]
--> x2 ist 3, xs2 ist [], prev2 ist:
scanr2 (+) 10 []
--> Basisfall, prev2 ist also [10]
--> wir verknüpfen x2 =3 mit dem Kopf von [10] und hängen [10] dran:
--> prev1 ist also [13,10]
--> wir verknüpfen x1 =2 mit dem Kopf von [13,10] und hängen [13,10] dran:
--> prev ist also [15,13,10]
--> wir verknüpfen x = 1 mit dem Kopf von [15,13,10] und hängen [15,13,10] dran:
--> ergebnis ist [16,15,13,10]


Wenn das klar ist, kannst du scanr3 sicher selbst auseinandernehmen
Zum Seitenanfang