Ich verstehe die Definitionen von foldl, foldr, aber ich habe Probleme mit Funktionen durch sie definiert.Funktionen definieren mit foldl foldr
Zum Beispiel Karte mit foldr:
map f [] = []
map f l = foldr (\x xs -> f x : xs) [] l
Ich verstehe nicht, die (\x xs -> f x : xs)
. Es ist die Kartenfunktion, die foldr nimmt? Aber sollte es nicht (\x xs -> f x : f xs)
sein, weil map f (x:xs) = f x : map f xs
?
Beispiel mit foldl:
concat (x:xs) = x ++ concat xs
concat' xs = foldl (++) [] xs
concat'' xs = foldl (\ys y -> ys ++ y) [] xs
Natürlich ich (++)
verstehen, aber was ist die Logik hinter (\ys y -> ys ++ y)
? Ist es ys = []
und y = xs
? Also die Funktion dauert []
als ys
und y
ist das erste Element von xs
und concases die []
mit der y
? Konkretes Beispiel:
concat'' [1,2,3] = foldl (\ys y -> ys ++ y) [] [1,2,3]
=> foldl (\ys y -> ys ++ y) ((\ys y -> ys ++ y) [] [1]) [2,3]
=> foldl (\ys y -> ys ++ y) [1] [2,3]
=> foldl (\ys y -> ys ++ y) ((\ys y -> ys ++ y) [1] [2]) [3]
=> foldl (\ys y -> ys ++ y) [1,2] [3]
=> foldl (\ys y -> ys ++ y) ((\ys y -> ys ++ y) [1,2] [3]) []
=> foldl (\ys y -> ys ++ y) [1,2,3] []
=> [1,2,3]
Eine andere Sache: concat
dauert nur 1 Liste xs
, also wenn ich 2 Listen verketten wollen?
concat (x:xs) ys = x ++ concat xs ys
concat [1,2,3] [4,5,6] with foldl?
Rückseite:
reverse (x:xs) = reverse xs ++ [x]
reverse' l = foldl (\xs x -> [x] : xs) [] l
reverse'' l = foldr (\x xs -> xs ++ [x]) [] l
Die foldr intuitiv klar ist (mit den Fragen von oben), aber was in foldl (\xs x -> [x] : xs)
hinter der umgekehrten Reihenfolge ist? Diese foldl (\x xs -> xs ++ [x]) [] l
wäre falsch, oder?
Vielen Dank!
das ist ein paar Fragen - für die erste Beobachtung, dass die 'xs' die re * wurde * mit 'f' gemappt (siehe die Definition von' foldr', um zu sehen, warum) (auch 'fxs' wäre nicht gut typisiert, wie du' f :: a -> b' und im gleiche Zeit 'f :: [a] -> b'', also müssten Sie' a ~ [a] ') identifizieren – Carsten
Beachte, dass' foldr fz [x1, x2, x3] = f x1 (f x2 (f x3 z)) 'so wurde das' xs' bereits durch 'f' abgebildet. – Bakuriu
für die zweite: nur beachten Sie, dass 'foldl 'wird * loop * durch' xs' von links (wieder auf die Definition) – Carsten