
At Wed, 2 Jan 2013 14:49:51 +0200, Roman Cheplyaka wrote:
I don't see how this is relevant.
Well, moving `flip one' in a let solves the problem, and The fact that let-bound variables are treated differently probably has a play here. I originally thought that this was because the quantifications will be all to the left in the let-bound variable while without a let-bound variable the types are used directly. However this doesn’t explain the behaviour I’m seeing.
GHC correctly infers the type of "flip one 'x'":
*Main> :t flip one 'x' flip one 'x' :: (forall a. a -> a) -> Char
But then somehow it fails to apply this to id. And there are no bound variables here that we should need to annotate.
Right. The weirdest thing is that annotating `flip one' (as in `three' in my code) or indeed `flip one 'x'' with the type that shows up in ghci makes things work: five = (flip one 'x' :: (forall a. a -> a) -> Char) id Francesco