Числовые литералы имеют полиморфный тип:
*Main> :t 3
3 :: (Num t) => t
Но если я привяжу переменную к такому литералу, полиморфизм будет потерян:
x = 3
...
*Main> :t x
x :: Integer
Если я определяю функцию, с другой стороны, она, конечно, полиморфна:
f x = 3
...
*Main> :t f
f :: (Num t1) => t -> t1
Я мог бы предоставить сигнатуру типа, чтобы гарантировать, что x
остается полиморфным:
x :: Num a => a
x = 3
...
*Main> :t x
x :: (Num a) => a
Но зачем это нужно? Почему не выведен полиморфный тип?