Рассмотрим следующую пару определений функций, которые передают проверку типа:
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