Ich denke, dass die Implementierung von map, foldl und foldr auf einfache Weise hilft, zu erklären, wie sie funktionieren. Gearbeitete Beispiele helfen auch bei unserem Verständnis.
myMap f [] = []
myMap f (x:xs) = f x : myMap f xs
myFoldL f i [] = i
myFoldL f i (x:xs) = myFoldL f (f i x) xs
> tail [1,2,3,4] ==> [2,3,4]
> last [1,2,3,4] ==> 4
> head [1,2,3,4] ==> 1
> init [1,2,3,4] ==> [1,2,3]
-- where f is a function,
-- acc is an accumulator which is given initially
-- l is a list.
--
myFoldR' f acc [] = acc
myFoldR' f acc l = myFoldR' f (f acc (last l)) (init l)
myFoldR f z [] = z
myFoldR f z (x:xs) = f x (myFoldR f z xs)
> map (\x -> x/2) [12,4,10,6] ==> [6.0,2.0,5.0,3.0]
> myMap (\x -> x/2) [12,4,10,6] ==> [6.0,2.0,5.0,3.0]
> foldl (\x y -> (x+y)/2) 54 [12, 4, 10, 6] ==> 10.125
> myFoldL (\x y -> (x+y)/2) 54 [12, 4, 10, 6] ==> 10.125
foldl from above: Starting accumulator = 54
(12 + 54)/2 = 33
(4 + 33)/2 = 18.5
(10 + 18.5)/2 = 14.25
(6 + 14.25)/2 = 10.125`
> foldr (++) "5" ["1", "2", "3", "4"] ==> "12345"
> foldl (++) "5" ["1", "2", "3", "4"] ==> “51234"
> foldr (\x y -> (x+y)/2) 54 [12,4,10,6] ==> 12
> myFoldR' (\x y -> (x+y)/2) 54 [12,4,10,6] ==> 12
> myFoldR (\x y -> (x+y)/2) 54 [12,4,10,6] ==> 12
foldr from above: Starting accumulator = 54
(6 + 54)/2 = 30
(10 + 30)/2 = 20
(4 + 20)/2 = 12
(12 + 12)/2 = 12
Sind Sie sicher, dass foldr auf unendlichen Listen arbeiten kann? Nach meinem Verständnis müssen die Klammern das letzte Element zuerst bewerten. –
Sie können beispielsweise 'map' mit Hilfe von foldr implementieren, und das funktioniert sogar auf unendlichen Listen. Dies funktioniert, weil (:) in seinem zweiten Argument oder in Englisch nicht strikt ist, weil der Schwanz der Ergebnisliste unbewertet bleiben kann, wenn man ihn entlanggeht. Es gibt viele Webseiten, die das besser erklären, als ich es kann, aber wie gesagt, es braucht einige Anstrengungen, um es zu verstehen. Es ist nicht trivial, zu erklären, wie sich fold * verhält * und wie es * definiert ist. – Nefrubyr
das ist absolut falsch. 'foldr' startet nicht von rechts. es ist * rechtsassoziativ *. Sie können überprüfen, indem Sie den Quellcode für die '[]' Instanz von 'Faltbare' http://hackage.haskell.org/package/base-4.10.0.0/docs/src/GHC.Base.html#foldr – kai