Это вызвано правилами по умолчанию Haskell для Num
класса . Если вы добавили
default (Double, Integer)
в начало вашего файла, тогда вы получите следующие результаты:
main = do
print (foo (read "7")) -- prints "14.0"
print (foo (read "7.2")) -- prints "14.2"
Короче говоря, правила по умолчанию - это попытка "попытаться сделать правильные вещи" и избавить вас от ошибки компиляции, когда в вашей программе есть неоднозначный тип. К сожалению, в этом случае он заменяет ошибку времени компиляции на ошибку времени выполнения.
Вы можете отключить настройки по умолчанию следующим образом:
default ()
, который заставит вас явно устранять неоднозначность типов таких терминов с помощью аннотаций типов:
print (foo (read "7" :: Int))