В Haskell, в чем разница между Int
и Integer
? Где задокументирован ответ?
В чем разница между Int и Integer?
Ответ 1
"Целое число" - произвольная точность type: он будет содержать любое число no насколько велика, до предела ваша машинная память.... Это означает, что у вас никогда не было арифметические переполнения. С другой это также означает, что ваша арифметика относительно медленно. Lisp пользователи могут узнайте здесь тип "bignum".
"Int" является более распространенным 32 или 64-битным целое число. Реализации различаются, хотя гарантировано менее 30 бит.
Источник: Haskell Wikibook. Кроме того, вы можете найти Numbers раздел "Нежное введение в Haskell".
Ответ 2
Int это тип машины целых чисел, с гарантированным диапазоном по крайней мере -2 29-29 - 1, в то время как целое является произвольной точностью целых числа, с диапазоном, как большое, как у вас есть памяти.
https://mail.haskell.org/pipermail/haskell-cafe/2005-May/009906.html
Ответ 3
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)
Ответ 4
Int - это C int, что означает, что его значения варьируются от -2147483647 до 2147483647, в то время как целое число из целого набора Z, это означает, что оно может быть сколь угодно большим.
$ ghci
Prelude> (12345678901234567890 :: Integer, 12345678901234567890 :: Int)
(12345678901234567890,-350287150)
Обратите внимание на значение литерала Int.
Ответ 5
Прелюдия определяет только самые базовые числовые типы: фиксированный размер целые числа (Int), произвольная точность целые числа (целое число),...
...
Конечный прецизионный целочисленный тип Int охватывает как минимум диапазон [- 2 ^ 29, 2 ^ 29 - 1].
из отчета Haskell: http://www.haskell.org/onlinereport/basic.html#numbers
Ответ 6
An Integer
реализуется как Int#
, пока он не станет больше максимального значения, которое может хранить Int#
. В этот момент это GMP номер.
Ответ 7
Целое число допускает более агрессивную оптимизацию, поскольку оно не ограничено неопределенным поведением в результате переполнения.
то есть компилятор должен предполагать, что написанное выражение никогда не будет иметь неопределенного поведения, и что любая потенциальная оптимизация, которую вводит компилятор, также не будет вводить новое неопределенное поведение.
или другой способ
выражение a - (b - c)
алгебраически эквивалентно (a + c) - b
но компилятор не может выполнить эту перестановку, поскольку возможно, что промежуточное значение a + c
переполнится входными данными, которые не вызовут переполнение в оригинал.