Qual è la differenza tra Int e Integer?


Risposte:


184

"Intero" è un tipo di precisione arbitraria: conterrà qualsiasi numero, non importa quanto sia grande, fino al limite della memoria della tua macchina…. Ciò significa che non si verificano mai overflow aritmetici. D'altra parte significa anche che l'aritmetica è relativamente lenta. Gli utenti Lisp possono riconoscere il tipo "bignum" qui.

"Int" è il numero intero più comune a 32 o 64 bit. Le implementazioni variano, sebbene sia garantito che siano almeno 30 bit.

Fonte: The Haskell Wikibook . Inoltre, potresti trovare utile la sezione Numbers di A Gentle Introduction to Haskell .


Secondo questa risposta , l'utilizzo Integerè spesso più veloce di quanto non sia
Maarten

6
@Maarten, è solo perché Int64è implementato piuttosto male sui sistemi a 32 bit. Sui sistemi a 64 bit, è fantastico.
dfeuer,

22

Intè Bounded, il che significa che è possibile utilizzare minBounde maxBoundscoprire i limiti, che sono dipendenti dall'implementazione ma garantiti per contenere almeno [-2 29 .. 2 29 -1].

Per esempio:

Prelude> (minBound, maxBound) :: (Int, Int)
(-9223372036854775808,9223372036854775807)

Tuttavia, Integerè precisione arbitraria e non 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 è C int, il che significa che i suoi valori vanno da -2147483647 a 2147483647, mentre un intervallo Integer dall'intero set Z , ciò significa che può essere arbitrariamente grande.

$ ghci
Prelude> (12345678901234567890 :: Integer, 12345678901234567890 :: Int)
(12345678901234567890,-350287150)

Notare il valore di Int letterale.


2
GHCi, versione 7.10.3 avvisa: il valore letterale 12345678901234567890 non rientra nell'intervallo Int -9223372036854775808..9223372036854775807
Adam

5

Preludio definisce solo i tipi numerici più elementari: numeri interi di dimensioni fisse (Int), numeri interi di precisione arbitraria (Integer), ...

...

Il tipo intero di precisione finita Int copre almeno l'intervallo [- 2 ^ 29, 2 ^ 29 - 1].

dal rapporto Haskell: http://www.haskell.org/onlinereport/basic.html#numbers


4

Un Integerviene implementato come un Int#fino a quando non diventa più grande del valore massimo che è Int#possibile memorizzare. A quel punto, è un numero GMP .


2
Questo sembra specifico per l'implementazione. C'è un riferimento che dice che Integer deve essere implementato in questo modo?
yoniLavi

4
No, hai ragione, questo è specifico per GHC. Detto questo, 1. GHC è ciò che la maggior parte delle persone usa, 2. Questo è il modo più intelligente che mi viene in mente di implementare un tale tipo di dati.
Nate Symer,

Questo significa che (in GHC) non ci sono compromessi prestazionali per l'utilizzo Integer, e quindi Integerè sempre l'opzione migliore?
Kirk Broadhurst,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.