【发布时间】:2011-03-26 15:36:32
【问题描述】:
在 Haskell 中,Int 和 Integer 有什么区别?答案记录在哪里?
【问题讨论】:
标签: haskell numbers integer int bignum
在 Haskell 中,Int 和 Integer 有什么区别?答案记录在哪里?
【问题讨论】:
标签: haskell numbers integer int bignum
Int 是机器整数的类型, 至少有保证范围 -229 到 229 - 1,而 Integer 是任意精度整数,具有 范围与您的内存一样大。
https://mail.haskell.org/pipermail/haskell-cafe/2005-May/009906.html
【讨论】:
“整数”是任意精度 类型:它将保存任何数字 不管多大,到极限 你机器的内存……这意味着你从来没有 算术溢出。在另一 手这也意味着你的算术是 比较慢。 Lisp 用户可以 在这里识别“bignum”类型。
“Int”是更常见的 32 位或 64 位 整数。实现方式不同, 虽然它保证在 至少 30 位。
来源:The Haskell Wikibook。此外,您可能会发现 Haskell 简介 中的 Numbers 部分很有用。
【讨论】:
Integer通常比is快
Int64 在 32 位系统上的实现相当糟糕。在 64 位系统上,这很棒。
Int 是 C 的 int,表示它的取值范围是 -2147483647 到 2147483647, 而整个 Z 集合中的 Integer 范围,这意味着它可以任意大。
$ ghci
Prelude> (12345678901234567890 :: Integer, 12345678901234567890 :: Int)
(12345678901234567890,-350287150)
注意 Int 字面量的值。
【讨论】:
前奏只定义了最 基本数字类型:固定大小 整数 (Int),任意精度 整数(整数),...
...
有限精度整数类型 Int 至少涵盖范围 [ - 2^29, 2^29 - 1]。
来自 Haskell 报告:http://www.haskell.org/onlinereport/basic.html#numbers
【讨论】:
Int 是Bounded,这意味着您可以使用minBound 和maxBound 找出限制,这些限制取决于实现但保证至少保持[-229 sup> .. 229-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)
【讨论】:
Integer 被实现为Int#,直到它大于Int# 可以存储的最大值。那时,它是一个GMP 号码。
【讨论】:
Integer 没有性能折衷,因此Integer 总是更好的选择?