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