web-dev-qa-db-fra.com

Quelle est la différence entre Int et Integer?

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

156
0xAX

"Entier" est un type de précision arbitraire: il contiendra n'importe quel nombre, peu importe 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'autre part, cela signifie également que votre calcul est relativement lent. Les utilisateurs de LISP peuvent reconnaître le type "bignum" ici.

"Int" est l'entier le plus commun sur 32 ou 64 bits. Les implémentations varient, bien qu’il soit garanti d’avoir au moins 30 bits.

Source: The Haskell Wikibook . Vous pouvez également trouver la section Numbers de Une introduction en douceur à Haskell utile.

168
bcat

Int est Bounded, ce qui signifie que vous pouvez utiliser minBound et maxBound pour connaître les limites dépendantes de l'implémentation mais garantissant au moins de tenir [-229 .. 229-1].

Par exemple:

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

Cependant, 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)
19
200_success

Int est le type d'entiers de la machine, avec une plage garantie d'au moins -2.29 à 229 - 1, while Entier correspond à des entiers de précision arbitraire, avec une étendue aussi grande que la mémoire vous le permet.

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

19
NullUserException

Int est le C int, ce qui signifie que ses valeurs vont de -2147483647 à 2147483647, tandis qu'un Integer va de l'ensemble Z défini, cela signifie qu'il peut être arbitrairement grand.

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

Notez la valeur du littéral Int.

10
Ming-Tang

Le prélude 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

5
newacct

Un Integer est implémenté en tant que Int# jusqu'à ce qu'il soit supérieur à la valeur maximale et Int# Peut stocker. À ce stade, il s’agit d’un numéro GMP .

4
Nate Symer

Integer permet des optimisations plus agressives car il n’est pas aussi contraint par un comportement indéfini à la suite de débordements.

en d'autres termes, le compilateur doit supposer que l'expression telle qu'elle est écrite ne rencontrera jamais de comportement indéfini, et que les optimisations potentielles introduites par le compilateur n'introduiront pas non plus de nouveau comportement indéfini.

ou d'une autre manière

l'expression a - (b - c) est algébriquement équivalente à (a + c) - b mais le compilateur ne peut pas effectuer ce réarrangement car il est possible que la valeur intermédiaire a + c débordera d'entrées qui ne provoqueraient pas de débordement dans l'original.

0
Famous Jameis