在Haskell中,Int
和Integer
之间有什么区别?答案记录在哪里?
答案 0 :(得分:165)
“整数”是一个任意精度 类型:它将保留任何数字号 无论多大,达到极限 你机器的记忆....这意味着你永远不会拥有 算术溢出。在另一 手也意味着你的算术 比较慢。 Lisp用户可能会 在这里认识到“bignum”类型。
“Int”是更常见的32位或64位 整数。实施方式各不相同 虽然它保证在 至少30位。
来源:The Haskell Wikibook。此外,您可能会发现 A Hntleell简介的Numbers部分很有用。
答案 1 :(得分:19)
Int 是机器整数的类型, 保证范围至少 -2 29 至2 29 - 1,而 Integer 是任意精度整数, 范围与你有记忆力一样大。
https://mail.haskell.org/pipermail/haskell-cafe/2005-May/009906.html
答案 2 :(得分:18)
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)
答案 3 :(得分:11)
Int是C int,表示其值范围为-2147483647到2147483647, 而整数 Z 集的整数范围,也就是说,它可以任意大。
$ ghci
Prelude> (12345678901234567890 :: Integer, 12345678901234567890 :: Int)
(12345678901234567890,-350287150)
注意Int文字的值。
答案 4 :(得分:5)
Prelude仅定义最多 基本数字类型:固定大小 整数(Int),任意精度 整数(整数),...
...
来自Haskell报告的有限精度整数类型Int 涵盖至少范围[ - 2 ^ 29, 2 ^ 29 - 1]。
答案 5 :(得分:4)
Integer
被实现为Int#
,直到它变得大于Int#
可以存储的最大值。那时,它是一个GMP号。
答案 6 :(得分:0)
整数允许进行更积极的优化,因为它不受溢出所导致的不确定行为的限制。
即,编译器必须假设所编写的表达式永远不会出现未定义的行为,并且编译器引入的任何潜在优化也不会引入新的未定义的行为。
或其他方式
表达式a - (b - c)
在代数上等效于(a + c) - b
,但是编译器无法进行这种重新排列,因为中间值a + c
可能会因输入溢出而不会引起溢出原来的。