What is the difference between Int and Integer?

81,753

Solution 1

"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

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

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

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

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.

Share:
81,753

Related videos on Youtube

0xAX
Author by

0xAX

I'm a software engineer with a particular interest in the Linux, git, low-level programming and programming in general. Now I'm working as Erlang and Elixir developer at Travelping. Writing blog about erlang, elixir and low-level programming for x86_64. Author of the Linux Insides book. My linkedin profile. Twitter: @0xAX Github: @0xAX

Updated on June 28, 2020

Comments

  • 0xAX
    0xAX almost 4 years

    In Haskell, what is the difference between an Int and an Integer? Where is the answer documented?

  • Maarten
    Maarten over 9 years
    According to this answer, using Integer is often faster than is
  • yoniLavi
    yoniLavi about 8 years
    This sounds implementation specific. Is there a reference saying that Integer needs to be implemented this way?
  • Nate Symer
    Nate Symer about 8 years
    No, you're right, this is GHC specific. That said, 1. GHC is what most people use, 2. This is the most intelligent way I can think of to implement such a data type.
  • dfeuer
    dfeuer over 7 years
    @Maarten, that's only because Int64 is implemented rather badly on 32-bit systems. On 64-bit systems, it's great.
  • Adam
    Adam over 6 years
    GHCi, version 7.10.3 gives warning : Literal 12345678901234567890 is out of the Int range -9223372036854775808..9223372036854775807
  • Kirk Broadhurst
    Kirk Broadhurst almost 5 years
    Does this mean that (in GHC) there's no performance tradeoff for using Integer, and therefore Integer is always the better option?