La aplicación asocia a la izquierda así que como bien habías observado, las expresiones flip foldr id
y (flip foldr) id
son equivalentes.
Como explicó Marcos más arriba
flip foldr :: b → (a → b → b) → [a] → b
porque flip intercambia los primeros dos argumentos. Este tipo es polimórfico, pensá que existen instancias de flip foldr para par de tipos a y b posibles. Estos tipos pueden ser monomórficos, o no.
Por ejemplo Bool → (Int → Bool → Bool) → [Int] → Bool
es una instancia de tipo para flip foldr (hacemos [b:= Char, a:=Int]
).
Por otro lado (c → c) → (a → (c → c) → (c → c)) → [a] → (c → c)
también es una instancia (hacemos [b:= c → c], es decir, b sique siendo polimórfico, pero no es cualquier cosa, sabemos que es una función de un tipo en sí mismo).
Cuando haacemos la aplicación para obtenerflip foldr id
, consumimos argumento (el b
en el tipo original), pero como id
tiene tipo c → c
(de nuevo uso la variable c
para que sea fresca), entonces necesitamos la instancia de flip foldr
adecuada (la más general posible, pero sabiendo que b era en realidad de la forma c → c
), que es la anterior ((c → c) → ( a → (c → c) → (c → c)) → [a] → (c → c)
).
Entonces queda flip foldr id :: (a → (c → c) → (c → c)) → [a] → (c → c)