Réponses:
"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 .
Int64
est assez mal implémenté sur les systèmes 32 bits. Sur les systèmes 64 bits, c'est génial.
Int
is Bounded
, ce qui signifie que vous pouvez utiliser minBound
et maxBound
connaî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, Integer
c'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)
Int est le type d'entiers machine, avec une plage garantie d'au moins -2 29 à 2 29 - 1, tandis que Integer est des entiers de précision arbitraire, avec une plage aussi grande que la mémoire pour laquelle vous avez de la mémoire.
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'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.
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
An Integer
est 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 .
Integer
, et que c'est donc Integer
toujours la meilleure option?
Integer
est souvent plus rapide qu'elle ne l'est