La razón de que no vuelve div
Infinity
es simple - no hay representación para el infinito en el tipo Integer
.
/
rendimientos Infinity
porque sigue el estándar IEEE 754 (que describe flotantes representaciones numéricas punto) desde el tipo predeterminado Fractional
es Double
. Otros lenguajes con números de coma flotante (por ejemplo, JavaScript) también exhiben este comportamiento.
Para hacer los matemáticos se encogen aún más, se obtiene un resultado diferente si se divide por negativo 0, a pesar del hecho de que -0 == 0
de flotadores:
Prelude> 1/(-0)
-Infinity
Este es también el comportamiento de la norma.
Si utiliza un tipo diferente como fraccional Rational
, obtendrá el comportamiento que espera:
Prelude> 1/(0 :: Rational)
*** Exception: Ratio.%: zero denominator
Casualmente, si se está preguntando acerca de por qué Integer
y Double
son los tipos en cuestión cuando su funcionamiento real no hace referencia a ellos, eche un vistazo a cómo Haskell maneja los tipos por defecto (especialmente los tipos numéricos) en el report.
La versión corta es que si tiene un tipo ambiguo de la clase Num
, Haskell primero probará Integer
y luego Double
para ese tipo. Puede cambiar esto con una instrucción default (Type1, Type2...)
o desactivarla con una instrucción default()
en el nivel del módulo.
Matemáticamente, tener el resultado de '1/0' ser' Infinito' está completamente justificado. No es el único valor de retorno justificable, sino el que tiene más sentido. Tenga en cuenta que también obtendrá un error de 'divide por cero' si evalúa '1/0 :: Rational'. –
@DanielFischer: No lo llamaría "justificado matemáticamente por completo", ya que este tipo de compactación (con infinito positivo y negativo) destruye bastantes teoremas que se mantienen ℝ, y algunos de ellos se asumen en muchos programas. – leftaroundabout
No debe suponer cosas así al trabajar con números de coma flotante. Incluso las propiedades básicas como la asociatividad no necesariamente se mantienen. La igualdad tampoco es reflexiva para 'NaN's! (Por ejemplo '(0/0)/= (0/0)'. –