В чем разница между Int и Integer? - PullRequest
156 голосов
/ 07 августа 2010

В Haskell, в чем разница между Int и Integer?Где ответ задокументирован?

Ответы [ 7 ]

166 голосов
/ 07 августа 2010

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

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

Источник: The Haskell Wikibook . Также вам может пригодиться раздел Numbers из A Gentle Введение в Haskell .

19 голосов
/ 07 августа 2010

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

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

18 голосов
/ 17 мая 2014

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)
11 голосов
/ 07 августа 2010

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

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

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

5 голосов
/ 07 августа 2010

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

...

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

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

4 голосов
/ 29 марта 2016

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

0 голосов
/ 27 июня 2019

Integer допускает более агрессивную оптимизацию, поскольку она не ограничена неопределенным поведением в результате переполнения.

, т. Е. Компилятор должен предполагать, что написанное выражение никогда не будет испытывать неопределенное поведение, и чтолюбая потенциальная оптимизация, которую вводит компилятор, также не будет вводить новое неопределенное поведение.

или другой способ

выражение a - (b - c) алгебраически эквивалентно (a + c) - b, но компилятор не может выполнить эту перестановкупоскольку возможно, что промежуточное значение a + c будет переполнено входами, которые не вызовут переполнение в оригинале.

...