Ответ 1
Две версии одинаковы. Ограничения и forall
-s выплывают в верхнюю часть области, когда они еще не существуют. Например, допустимы следующие определения:
foo :: a -> a -> Num a => a
foo = (+)
bar :: a -> forall b. b -> a
bar = const
Но :t foo
выводит Num a => a -> a -> a
и :t bar
выводит a -> b -> a
(что эквивалентно forall a b. a -> b -> a
).
GHC не поддерживает типы полиморфных возвратов, поэтому ограничения и кванторы выплывают. Я предполагаю, что это мог быть также правильный выбор дизайна для GHC для ошибок.