I\'m curious about the expression flip id (It\'s not homework: I found it in the getOpt documentation).
I wonder why it has this type:
The id function has this type:
id :: a -> a
You get an instance of this type, when you replace a by a -> b:
id :: (a -> b) -> (a -> b)
which, because of currying, is the same as:
id :: (a -> b) -> a -> b
Now apply flip to this and you get:
flip id :: a -> (a -> b) -> b
In the case of id (+) the instance is:
id :: (Num a) => (a -> a) -> (a -> a)
Now flip id gives you:
flip id :: (Num a) => a -> (a -> a) -> a
Side note: This also shows you how ($) is the same as id, just with a more restricted type:
($) :: (a -> b) -> a -> b
($) f x = f x
-- unpoint:
($) f = f
-- hence:
($) = id