Creo que implementar map, foldl y foldr de una manera simple ayuda a explicar cómo funcionan. Los ejemplos trabajados también ayudan en nuestra comprensión.
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
¿Estás seguro de que foldr puede funcionar en listas infinitas? Según entiendo, los corchetes significan que primero tiene que evaluar el último elemento. –
Puede implementar 'mapa', por ejemplo, usando foldr, y eso funcionará incluso en listas infinitas. Esto funciona porque (:) no es estricto en su segundo argumento, o en inglés, porque la cola de la lista de resultados puede permanecer sin evaluar a medida que lo recorre. Hay muchas páginas web que explican esto mejor que yo, pero como dije, se necesita un poco de esfuerzo para entenderlo. Conciliar cómo se comporta * foldr * y cómo * se define * no es trivial. – Nefrubyr
esto es francamente falso. 'foldr' no" comienza desde la derecha ". es * asociativo correcto *. puede verificar leyendo el código fuente de la instancia '[]' de 'Plegable' http://hackage.haskell.org/package/base-4.10.0.0/docs/src/GHC.Base.html#foldr – kai