En Haskell, quelle est la différence entre un Int
et un Integer
? Où la réponse est-elle documentée?
"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.
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)
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
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.
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
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 .
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.