Рассмотрим следующую пару определений функций, которые передают проверку типа:
a :: forall a. a
a = undefined
b :: Int
b = a
т.е. выражение типа forall a. a может использоваться там, где ожидается один из типов Int. Мне кажется, что это похоже на подтипирование, но утверждается, что система типа Haskell не имеет подтипов. Как отличаются эти формы взаимозаменяемости?
Этот вопрос не относится к forall a. a. Другие примеры:
id :: forall a. a -> a
id x = x
idInt :: Int -> Int
idInt = id