Respuestas:
"Integer" es un tipo de precisión arbitraria: contendrá cualquier número, sin importar cuán grande sea, 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 número entero de 32 o 64 bits más común. Las implementaciones varían, aunque se garantiza que sea de al menos 30 bits.
Fuente: The Haskell Wikibook . Además, puede encontrar útil la sección Números de Una Introducción Suave a Haskell .
Int64
se implementa bastante mal en los sistemas de 32 bits. En sistemas de 64 bits, es genial.
Int
es Bounded
decir, puede usar minBound
y maxBound
para averiguar los límites, que dependen de la implementación pero que tienen una garantía de al menos [-2 29 .. 2 29 -1].
Por ejemplo:
Prelude> (minBound, maxBound) :: (Int, Int)
(-9223372036854775808,9223372036854775807)
Sin embargo, Integer
es 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)
Int es el tipo de enteros de máquina, con un rango garantizado de al menos -2 29 a 2 29 - 1, mientras que Integer es enteros de precisión arbitraria, con un rango tan grande para el que tiene memoria.
https://mail.haskell.org/pipermail/haskell-cafe/2005-May/009906.html
Int es el C int, lo que significa que sus valores oscilan entre -2147483647 y 2147483647, mientras que un rango entero de todo el conjunto Z , eso significa que puede ser arbitrariamente grande.
$ ghci
Prelude> (12345678901234567890 :: Integer, 12345678901234567890 :: Int)
(12345678901234567890,-350287150)
Observe el valor del literal Int.
El Preludio define solo los tipos numéricos más básicos: enteros de tamaño fijo (Int), enteros de precisión arbitraria (Integer), ...
...
El tipo entero 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
Un Integer
se implementa como Int#
hasta que se hace más grande que el valor máximo que Int#
puede almacenar una lata. En ese punto, es un número GMP .
Integer
y, por Integer
lo tanto, siempre es la mejor opción?
Integer
es a menudo más rápido de lo que es