Проверьте выводимый тип ниже Threshold в ghci, прежде чем добавлять аннотацию:
> :t belowThreshold
belowThreshold :: [Double] -> [Double]
Звучит так, как вы ожидали Num a => [a] -> [a]
, когда вы сказали "ограничить эту функцию". Вы фактически меняете тип функции, когда добавляете аннотацию [Integer] -> [Integer]
.
Чтобы сделать это, используйте явное преобразование:
belowThreshold = filter ((< 5.2) . fromIntegral)
Теперь belowThreshold :: [Integer] -> [Integer]
как ты и хотел. Но целые числа преобразуются в двойные, прежде чем сравнивать с 5.2.
Так зачем вам конвертация? Ошибка типа, вероятно, ввела вас в заблуждение: список целых чисел не был преобразован в двойные по сравнению с 5.2, реальная проблема заключается в том, что только Двойные числа можно сравнить с двойными, поэтому вы должны передать список двойников на belowThreshold
. У Haskell нет неявных преобразований, даже между числами. Если вы хотите конверсии, вы должны написать их самостоятельно.
Я хочу ограничить эту функцию работой только со списками ввода типа [Int] по моим собственным причинам. Это похоже на разумный запрос.
Ну, с точки зрения системы типов, нет. Это разумный код?
'c' < "foo"
А как насчет этого?
12 < "bar"
Все эти значения являются экземплярами Ord
, но вы не можете использовать их вместе с (<)
. У Haskell нет неявных преобразований. Поэтому, даже если два значения являются экземплярами Num
и Ord
, вы не сможете сравнить их с (<)
, если они относятся к разным типам.