В чем разница между Int и Integer?

Ответы:

184

«Integer» - это произвольный тип точности: он будет содержать любое число, независимо от его размера, до предела памяти вашей машины…. Это означает, что у вас никогда не бывает арифметических переполнений. С другой стороны, это также означает, что ваша арифметика относительно медленная. Пользователи Lisp могут узнать тип "bignum" здесь.

«Int» - более распространенное 32- или 64-разрядное целое число. Реализации различаются, хотя гарантированно должно быть не менее 30 бит.

Источник: The Haskell Wikibook . Кроме того, вам может пригодиться раздел « Числа » в «Нежном введении в Haskell» .

bcat
источник
Согласно этому ответу , использование Integerчасто быстрее, чем есть
Мартен
6
@ Maarten, это только потому, что Int64он плохо реализован на 32-битных системах. На 64-битных системах это здорово.
dfeuer 21.09.16
22

Intесть Bounded, что означает, что вы можете использовать minBoundи maxBoundвыяснить пределы, которые зависят от реализации, но гарантированно будут содержать не менее [-2 29 .. 2 29 -1]

Например:

Prelude> (minBound, maxBound) :: (Int, Int)
(-9223372036854775808,9223372036854775807)

Впрочем, Integerэто произвольная точность и нет 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)
200_success
источник
20

Int это тип машины целых чисел, с гарантированным диапазоном по крайней мере , -2 29 до 2 29 - 1, в то время как целое является произвольной точностью целых чисел, с диапазоном , как большие , как у вас есть памяти.

https://mail.haskell.org/pipermail/haskell-cafe/2005-May/009906.html

NullUserException
источник
10

Int - это C int, что означает, что его значения находятся в диапазоне от -2147483647 до 2147483647, в то время как диапазон целых чисел из всего множества Z означает, что он может быть сколь угодно большим.

$ ghci
Prelude> (12345678901234567890 :: Integer, 12345678901234567890 :: Int)
(12345678901234567890,-350287150)

Обратите внимание на значение литерала Int.

Мин-Tang
источник
2
GHCi, версия 7.10.3, выдает предупреждение: литерал 12345678901234567890 находится вне диапазона Int -9223372036854775808..9223372036854775807
Адам
5

Prelude определяет только самые основные числовые типы: целые числа фиксированного размера (Int), целые числа произвольной точности (Integer), ...

...

Целочисленный тип Int с конечной точностью охватывает как минимум диапазон [- 2 ^ 29, 2 ^ 29 - 1].

из отчета на Haskell: http://www.haskell.org/onlinereport/basic.html#numbers

newacct
источник
4

An Integerреализуется как, Int#пока не станет больше, чем максимальное значение, которое Int#может хранить. На данный момент это номер GMP .

Нейт Симер
источник
2
Это звучит специфично для реализации. Есть ли упоминание о том, что Integer должен быть реализован таким образом?
yoniLavi
4
Нет, вы правы, это специфично для GHC. Тем не менее, 1. GHC - это то, что использует большинство людей, 2. Это самый разумный способ реализовать такой тип данных.
Нейт Симер
Означает ли это, что (в GHC) не существует компромисса между производительностью Integerи, следовательно Integer, всегда лучший вариант?
Кирк Бродхерст