- forall b. (forall a. a) -> b
- forall a b. a -> b
The first one takes a polymorphic value of type (forall a. a). This means we could instantiate it to be of any type (e.g. b).
The second one takes a value of any type (not the value of a polymorphic type).
Thus you cannot apply function with first type to True, because True has a concrete type Bool and is not polymorphic.
Consider another example:
- forall b. Num b => (forall a. Num a => a) -> b
-
forall a b. (Num a, Num b) => a -> b
Here in first case function takes a polymorphic numeric value and returns another, you could define it to be f x = x + 1. But this function can only be applied to a polymorphic value (forall a. Num a => a). E.g. f (fromIntegral 2).
In second case you already have some numeric value and, unfortunately, you cannot use it: you have no way to convert Num types between each other.
Best regards,
Nick