Причина, по которой 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 ()
на уровне модуля.
person
Tikhon Jelvis
schedule
19.02.2012
1 / 0
равенInfinity
полностью оправдан. Это не единственное допустимое возвращаемое значение, но наиболее разумное. Обратите внимание, что вы также получите ошибкуdivide by zero
, если оцените1 / 0 :: Rational
. - person Daniel Fischer   schedule 20.02.2012NaN
s! (Например,(0/0) /= (0/0)
. - person Tikhon Jelvis   schedule 20.02.20121/0
. Но компактификация Александрова также разрушает многие полезные свойства ℝ, не говоря уже о компактификации Чеха. - person Daniel Fischer   schedule 20.02.2012