В чем разница между 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.