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


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)


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.


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


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 .


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.