lectura "Real World Haskell", en la página 95 el autor proporciona un ejemplo:La función obtiene cuatro argumentos en lugar de tres: ¿por qué no se rompe esto?
myFoldl f z xs = foldr step id xs z
where step x g a = g (f a x)
Mi pregunta es: ¿Por qué se compila el código? foldr
toma solo tres argumentos, pero aquí se pasa a cuatro: step
, id
, xs
, z
.
Por ejemplo, esto no funciona (porque suma espera uno):
sum filter odd [1,2,3]
lugar tengo que escribir:
sum $ filter odd [1,2,3]
No entiendo por qué puede hacer 'id id 5', pero no puede hacer:' foo x = x + 1; bar y = y + 1; foo bar 1'? – drozzy
@drozzy: se trata de tipos y polimorfismo. Tome 'id :: a -> a': puede sustituir * cualquier * tipo por' a'. Sin embargo, 'foo' es diferente, porque tiene restricciones: necesita un número:' foo :: (Num a) => a -> a'. 'bar :: (Num a) => a -> a' no es una instancia de la clase de tipo' Num' y por lo tanto no satisface la restricción '(Num a)' de 'foo'. –
@drozzy ¡Quizás ayude si clarificamos la asociatividad de la aplicación de la función! Recuerde que 'id id 5' se analiza como' (id id) 5' - es decir, da 'id' como argumento a' id' primero, y luego '5' como argumento para el resultado - no como' id (id 5) '. –