Esto se debe a que el orden de los argumentos se invierte en foldl
. Compara sus firmas de tipos:
foldl :: (a -> b -> a) -> a -> [b] -> a
foldr :: (a -> b -> b) -> b -> [a] -> b
Como puede ver, en su código utilizando foldl
, que repeatly incrementar el acumulador, haciendo caso omiso de la lista. Pero en el código con foldr
, ni siquiera toca el acumulador, sino que simplemente incrementa el elemento de la lista. Como el último elemento es 3
, el resultado es 3 + 1 = 4
.
Se podía ver su misstake más fácil, si tendrá que utilizar una lista de caracteres también conocido como cadena en lugar:
ghci> foldr (\_ -> (+1)) 0 ['a','b','c']
3
ghci> foldl (\_ -> (+1)) 0 ['a','b','c']
:1:20:
No instance for (Num Char)
arising from the literal `0'
Possible fix: add an instance declaration for (Num Char)
In the second argument of `foldl', namely `0'
In the expression: foldl (\ _ -> (+ 1)) 0 ['a', 'b', 'c']
In an equation for `it':
it = foldl (\ _ -> (+ 1)) 0 ['a', 'b', 'c']
ghci>
Bienvenido a stackoverflow.com! No es necesario agregar una firma, ya que aparecerá un cuadro con su nombre en la parte inferior de su pregunta. – fuz
Usted sabe, puede enviar una respuesta si lo desea haciendo clic en el triángulo que se encuentra arriba del número a la izquierda de cada respuesta y marcarla como aceptada haciendo clic en la marca debajo del número. – fuz
¡Gracias por los consejos! – Frank