¿Cuál es la diferencia entre Int e Integer?

Respuestas:

184

"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 .

bcat
fuente
Según esta respuesta , el uso Integeres a menudo más rápido de lo que es
Maarten
66
@Maarten, eso es solo porque Int64se implementa bastante mal en los sistemas de 32 bits. En sistemas de 64 bits, es genial.
dfeuer
22

Intes Boundeddecir, puede usar minBoundy maxBoundpara 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, Integeres 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)
200_success
fuente
10

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.

Ming-Tang
fuente
2
GHCi, versión 7.10.3 da advertencia: Literal 12345678901234567890 está fuera del rango Int -9223372036854775808..9223372036854775807
Adam
5

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

newacct
fuente
4

Un Integerse 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 .

Nate Symer
fuente
2
Esto suena específico de implementación. ¿Hay alguna referencia que diga que Integer debe implementarse de esta manera?
yoniLavi
44
No, tienes razón, esto es específico de GHC. Dicho esto, 1. GHC es lo que usa la mayoría de las personas, 2. Esta es la forma más inteligente que se me ocurre para implementar dicho tipo de datos.
Nate Symer
¿Significa esto que (en GHC) no hay una compensación de rendimiento por usar Integery, por Integerlo tanto, siempre es la mejor opción?
Kirk Broadhurst