Рассмотрим следующую функцию Haskell:
sign a
| a < 0 = (-1)
| a > 0 = 1
| otherwise = 0
Когда я загружаю это в ghci, я ожидал, что :t sign
будет:
sign :: (Num a, Ord a) => a -> Integer
Вместо этого он сделал вывод, что:
*Main> :t sign
sign :: (Num a1, Num a, Ord a1) => a1 -> a
Аналогично, если я задаю тип целого 5
, я ожидал Integer
, но вместо этого я получил
*Main> :t 5
5 :: Num a => a
Там что-то я не понимаю о типах Haskell. Дело в том, что если все, что я знаю о типе return sign
, это то, что он является экземпляром класса Num
, тогда я не смог бы передать его возвращаемое значение в эту функцию:
double :: Integer -> Integer
double x = x * 2
То есть для моей функции double
требуется Integer
, а не только любой экземпляр Num
.
Тем не менее, следующее работает очень хорошо:
*Main> double (sign 5.5)
2
Что я плохо понимаю о системе типа Haskell?