Quelle est la différence entre Int et Integer?

En Haskell, quelle est la différence entre un Int et Integer? Où est la réponse documentée?

140
demandé sur duplode 2010-08-07 09:52:22

6 réponses

"Entier" est une précision arbitraire type: il tiendra n'importe quel nombre aucun importe comment grand, jusqu'à la limite de votre mémoire de l'ordinateur.... Cela signifie que vous n'aurez jamais débordements arithmétiques. Sur l'autre main cela signifie également que votre arithmétique est relativement lente. Les utilisateurs Lisp peuvent reconnaissez le type" bignum " ici.

" Int " est le bit 32 ou 64 le plus commun entier. Les implémentations varient, bien qu'il soit toujours au rendez-vous moins 30 bits.

Source: Le Haskell Wikibook . En outre, vous pouvez trouver la sectionNumbers deUne Introduction douce à Haskell utile.

146
répondu bcat 2010-08-07 15:39:28

Int est le type d'entiers de machine, avec la gamme garantie au moins -229 pour 229 - 1, alors que Integer est une précision arbitraire entiers, avec gamme aussi grande que vous avez de la mémoire pour.

Https://mail.haskell.org/pipermail/haskell-cafe/2005-May/009906.html

18
répondu NullUserException 2016-03-10 20:21:19

Int est Bounded, ce qui signifie que vous pouvez utiliser minBound et maxBound pour trouver les limites, qui sont dépendant de l'implémentation, mais garanti pour contenir au moins [-229 .. 229-1].

Par exemple:

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

Toutefois, Integer est une précision arbitraire, et non pas 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)
16
répondu 200_success 2014-05-16 21:28:48

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

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

Notez la valeur du littéral Int.

11
répondu Ming-Tang 2010-08-07 06:00:01

Le Prélude ne définit que le plus types numériques de base: taille fixe entiers (Int), précision arbitraire les entiers (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

5
répondu newacct 2010-08-07 06:49:00

Un {[0] } est implémenté en tant que Int# jusqu'à ce qu'il soit supérieur à la valeur maximale qu'un Int# peut stocker. À ce stade, c'est un numéro GMP.

1
répondu Nate Symer 2016-04-09 21:34:37