haskell - realfrac - ¿Cuál es la diferencia entre Int y Entero?
realfrac haskell (6)
"Entero" es un tipo de precisión arbitraria: mantendrá cualquier número, sin importar cuán grande, hasta el límite de la memoria de su máquina .... Esto significa que nunca tiene desbordamientos aritméticos. Por otro lado, también significa que su aritmética es relativamente lenta. Los usuarios de Lisp pueden reconocer el tipo "bignum" aquí.
"Int" es el entero más común de 32 o 64 bits. Las implementaciones varían, aunque se garantiza que sean de al menos 30 bits.
Fuente: The Haskell Wikilibro . Además, puede encontrar útil la sección Numbers de A Gentle Introduction to Haskell .
En Haskell, ¿cuál es la diferencia entre un Int
y un Integer
? ¿Dónde está documentada la respuesta?
El Preludio define solo los tipos numéricos más básicos: enteros de tamaño fijo (Int), enteros de precisión arbitrarios (enteros), ...
...
El tipo de enteros de precisión finita Int cubre al menos el rango [- 2 ^ 29, 2 ^ 29 - 1].
del informe Haskell: http://www.haskell.org/onlinereport/basic.html#numbers
Int es el tipo de enteros de la máquina, con un rango garantizado de al menos -2,29 a 229 - 1, mientras que Integer es enteros de precisión arbitrarios, con un rango tan grande como la memoria que tenga.
https://mail.haskell.org/pipermail/haskell-cafe/2005-May/009906.html
Int es C int, lo que significa que su rango de valores es de -2147483647 a 2147483647, mientras que un rango entero de todo el conjunto Z , es decir, puede ser arbitrariamente grande.
$ ghci
Prelude> (12345678901234567890 :: Integer, 12345678901234567890 :: Int)
(12345678901234567890,-350287150)
Observe el valor del literal Int.
Un Integer
se implementa como un Int#
hasta que se vuelve más grande que el valor máximo que puede almacenar un Int#
. En ese punto, es un número GMP .
Int
está Bounded
, lo que significa que puede usar minBound
y maxBound
para averiguar los límites, que dependen de la implementación, pero que se garantiza que se mantendrán al menos [-2 29 .. 2 29 -1].
Por ejemplo:
Prelude> (minBound, maxBound) :: (Int, Int)
(-9223372036854775808,9223372036854775807)
Sin embargo, Integer
es una precisión arbitraria, y no Bounded
.
Prelude> (minBound, maxBound) :: (Integer, Integer)
<interactive>:3:2:
No instance for (Bounded Integer) arising from a use of `minBound''
Possible fix: add an instance declaration for (Bounded Integer)
In the expression: minBound
In the expression: (minBound, maxBound) :: (Integer, Integer)
In an equation for `it'':
it = (minBound, maxBound) :: (Integer, Integer)