Причина, по которой div
не возвращает Infinity
, проста - в типе Integer
нет представления для бесконечности.
/
возвращает Infinity
, поскольку оно соответствует стандарту IEEE 754 (который описывает представления чисел с плавающей запятой), поскольку типом Fractional
по умолчанию является Double
. Другие языки с числами с плавающей запятой (например, JavaScript) также демонстрируют такое поведение.
Чтобы математики съежились еще больше, вы получите другой результат, если поделите на минус 0, несмотря на то, что -0 == 0
для чисел с плавающей запятой:
Prelude> 1/(-0)
-Infinity
Это тоже поведение из стандарта.
Если вы используете другой дробный тип, например Rational
, вы получите ожидаемое поведение:
Prelude> 1 / (0 :: Rational)
*** Exception: Ratio.%: zero denominator
Кстати, если вам интересно, почему Integer
и Double
являются типами, о которых идет речь, когда ваша фактическая операция не ссылается на них, взгляните на то, как Haskell обрабатывает типы по умолчанию (особенно числовые) в Сообщение .
Короткая версия: если у вас есть неоднозначный тип из класса Num
, Haskell сначала попытается Integer
, а затем Double
для этого типа. Вы можете изменить это с помощью оператора default (Type1, Type2...)
или отключить его с помощью оператора default ()
на уровне модуля.