What is the difference between Int and Integer?

HaskellNumbersIntegerIntBignum

Haskell 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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Question0xAXView Question on Stackoverflow
Solution 1 - HaskellbcatView Answer on Stackoverflow
Solution 2 - Haskell200_successView Answer on Stackoverflow
Solution 3 - HaskellNullUserExceptionView Answer on Stackoverflow
Solution 4 - HaskellMing-TangView Answer on Stackoverflow
Solution 5 - HaskellnewacctView Answer on Stackoverflow
Solution 6 - HaskellNate SymerView Answer on Stackoverflow