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


Ответы:


184

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

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

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


Согласно этому ответу , использование 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)


10

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

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

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


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


4

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


2
Это звучит специфично для реализации. Есть ли упоминание о том, что Integer должен быть реализован таким образом?
yoniLavi

4
Нет, вы правы, это специфично для GHC. Тем не менее, 1. GHC - это то, что использует большинство людей, 2. Это самый разумный способ реализовать такой тип данных.
Нейт Симер

Означает ли это, что (в GHC) не существует компромисса между производительностью Integerи, следовательно Integer, всегда лучший вариант?
Кирк Бродхерст
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.