What is the difference between Int and Integer?
HaskellNumbersIntegerIntBignumHaskell Problem Overview
In Haskell, what is the difference between an Int
and an Integer
? Where is the answer documented?
Haskell Solutions
Solution 1 - Haskell
> "Integer" is an arbitrary precision > type: it will hold any number no > matter how big, up to the limit of > your machine's memory…. This means you never have > arithmetic overflows. On the other > hand it also means your arithmetic is > relatively slow. Lisp users may > recognise the "bignum" type here. > > "Int" is the more common 32 or 64 bit > integer. Implementations vary, > although it is guaranteed to be at > least 30 bits.
Source: The Haskell Wikibook. Also, you may find the Numbers section of A Gentle Introduction to Haskell useful.
Solution 2 - Haskell
Int
is Bounded
, which means that you can use minBound
and maxBound
to find out the limits, which are implementation-dependent but guaranteed to hold at least [-229 .. 229-1].
For example:
Prelude> (minBound, maxBound) :: (Int, Int)
(-9223372036854775808,9223372036854775807)
However, Integer
is arbitrary precision, and not 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)
Solution 3 - Haskell
> Int is the type of machine integers, > with guaranteed range at least > -229 to 229 - 1, while Integer is arbitrary precision integers, with > range as large as you have memory for.
https://mail.haskell.org/pipermail/haskell-cafe/2005-May/009906.html
Solution 4 - Haskell
Int is the C int, which means its values range from -2147483647 to 2147483647, while an Integer range from the whole Z set, that means, it can be arbitrarily large.
$ ghci
Prelude> (12345678901234567890 :: Integer, 12345678901234567890 :: Int)
(12345678901234567890,-350287150)
Notice the value of the Int literal.
Solution 5 - Haskell
> The Prelude defines only the most > basic numeric types: fixed sized > integers (Int), arbitrary precision > integers (Integer), ...
...
> The finite-precision integer type Int > covers at least the range [ - 2^29, > 2^29 - 1].
from the Haskell report: http://www.haskell.org/onlinereport/basic.html#numbers
Solution 6 - Haskell
An Integer
is implemented as an Int#
until it gets larger than the maximum value an Int#
can store. At that point, it's a GMP number.