Яка різниця між Int та Integer?


Відповіді:


183

"Цілий" - це довільний спосіб точності: він може містити будь-яке число, незалежно від величини, до межі пам'яті вашої машини…. Це означає, що ви ніколи не маєте арифметичних переливів. З іншого боку, це також означає, що ваша арифметика є відносно повільною. Тут користувачі Lisp можуть розпізнати тип "bignum".

"Int" - це більш поширене 32 або 64 бітове ціле число. Реалізація відрізняється, хоча гарантується щонайменше 30 біт.

Джерело: Вісник «Haskell» . Крім того , ви можете знайти Число розділ A Gentle Введення в Haskell корисного.


Відповідно до цієї відповіді , користування Integerчасто швидше, ніж є
Маартен

6
@Maarten, це лише тому Int64, що реалізовано досить погано в 32-бітних системах. У 64-бітних системах це чудово.
dfeuer

21

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, тоді як діапазон Integer від усього набору Z , це означає, що він може бути довільно великим.

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

Зверніть увагу на значення літералу Int.


2
GHCi, версія 7.10.3 попереджає: Literal 12345678901234567890 поза діапазоном Int -9223372036854775808..9223372036854775807
Адам

5

Прелюдія визначає лише основні числові типи: цілі числа з фіксованим розміром (Int), цілі числа довільної точності (Integer), ...

...

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

зі звіту Haskell: http://www.haskell.org/onlinereport/basic.html#numbers


4

Реалізація 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.