Quelle est la différence entre Int et Integer?

169

Dans Haskell, quelle est la différence entre un Intet un Integer? Où la réponse est-elle documentée?

0xAX
la source

Réponses:

184

"Integer" est un type de précision arbitraire: il contiendra n'importe quel nombre, quelle que soit sa taille, jusqu'à la limite de la mémoire de votre machine…. Cela signifie que vous n'avez jamais de débordements arithmétiques. D'un autre côté, cela signifie également que votre arithmétique est relativement lente. Les utilisateurs de Lisp peuvent reconnaître le type "bignum" ici.

"Int" est l'entier 32 ou 64 bits le plus courant. Les implémentations varient, même si elle est garantie d'au moins 30 bits.

Source: Le Wikibook Haskell . De plus, vous trouverez peut-être utile la section Numbers de A Gentle Introduction to Haskell .

bcat
la source
Selon cette réponse , l'utilisation Integerest souvent plus rapide qu'elle ne l'est
Maarten
6
@Maarten, c'est uniquement parce qu'il Int64est assez mal implémenté sur les systèmes 32 bits. Sur les systèmes 64 bits, c'est génial.
dfeuer le
22

Intis Bounded, ce qui signifie que vous pouvez utiliser minBoundet maxBoundconnaître les limites, qui dépendent de l'implémentation mais qui sont garanties au moins [-2 29 .. 2 29 -1].

Par exemple:

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

Cependant, Integerc'est une précision arbitraire, et 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)
200_succès
la source
10

Int est le C int, ce qui signifie que ses valeurs vont de -2147483647 à 2147483647, tandis qu'une plage entière de l'ensemble Z complet , cela signifie qu'elle peut être arbitrairement grande.

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

Notez la valeur du littéral Int.

Ming-Tang
la source
2
GHCi, version 7.10.3 donne un avertissement: Le littéral 12345678901234567890 est hors de la plage Int -9223372036854775808..9223372036854775807
Adam
5

Le Prelude ne définit que les types numériques les plus élémentaires: entiers de taille fixe (Int), entiers de précision arbitraire (Integer), ...

...

Le type entier de précision finie Int couvre au moins la plage [- 2 ^ 29, 2 ^ 29 - 1].

extrait du rapport Haskell: http://www.haskell.org/onlinereport/basic.html#numbers

newacct
la source
4

An Integerest implémenté comme un Int#jusqu'à ce qu'il devienne plus grand que la valeur maximale qu'un Int#peut stocker. À ce stade, c'est un numéro GMP .

Nate Symer
la source
2
Cela semble spécifique à la mise en œuvre. Y a-t-il une référence indiquant que Integer doit être implémenté de cette façon?
yoniLavi
4
Non, vous avez raison, c'est spécifique au GHC. Cela dit, 1. GHC est ce que la plupart des gens utilisent, 2. C'est le moyen le plus intelligent auquel je puisse penser pour implémenter un tel type de données.
Nate Symer
Cela signifie-t-il que (dans GHC) il n'y a pas de compromis de performance pour l'utilisation Integer, et que c'est donc Integertoujours la meilleure option?
Kirk Broadhurst