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