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?

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 .


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)


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.


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


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 .


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.