Thu Aug 20 09:11:55 EDT 2015


foo :: (forall a. a -> a) -> (Char,Bool)
bar :: forall a. ((a -> a) -> (Char, Bool))

Some good explanations in [1].

For the above, the a->a in foo has to be polymorphic: type is
instantiated at the implementation site.  In bar, a->a can be any
(concrete) function mapping some type a to a.

[1] https://stackoverflow.com/questions/3071136/what-does-the-forall-keyword-in-haskell-ghc-do