Ich machte die Übungen von YAHT's Recursive Datatype Abschnitt, und fand das Schreiben der listFoldr
Funktion ein bisschen schwierig (vor allem, weil ich den Unterschied zwischen foldl
und foldr
auf den ersten nicht wirklich verstanden habe). Wenn ich genau endlich erkannt, wie die foldr
Funktion arbeitete, habe ich beschlossen, dass ein einfacher Tausch von Funktionsargumenten wäre alles, was benötigt würde meine listFoldl
Funktion auf eine listFoldr
Funktion zu ändern:Ist das eine korrekte Art, die Haskell-Foldr-Funktion zu schreiben?
listFoldl f i [] = i
listFoldl f i (x:xs) = listFoldl f (f i x) xs
listFoldr f i [] = i
listFoldr f i (x:xs) = listFoldr f (f x i) xs
Dies scheint zu funktionieren (ich habe mehr Tests als diese):
Main> foldr (-) 4 [1, 2, 3]
-2
Main> listFoldr (-) 4 [1, 2, 3]
-2
Aber die solution für die Ausübung gegeben ist ganz anders als meine. Ihre listFoldl
ist genau das gleiche wie meine, aber Blick auf ihre listFoldr
:
listFoldr f i [] = i
listFoldr f i (x:xs) = f x (listFoldr f i xs)
Welche Lösung ist besser, meine oder ihre? Ist einer von ihnen falsch? (In meinen Tests enden beide mit genau dem gleichen Ergebnis ...)
ah Ich denke, ich wählte eine schlechte Art, es zu testen. Vielen Dank! –
ein einfacher Test wäre 'listFoldr (:)" "" abc "' (wie newacct erwähnt, 'listFoldr (:) []' ist die Identitätsfunktion für Listen) –