Int和Integer有什么区别?


Answers:


183

“整数”是一个任意精度类型:无论大小,它都可以容纳任意数字,最大可达机器内存的大小……。这意味着您永远不会发生算术溢出。另一方面,这也意味着您的算术相对较慢。Lisp用户可以在此处识别“ bignum”类型。

“ Int”是更常见的32或64位整数。尽管可以保证至少为30位,但实现方式有所不同。

来源:Haskell Wikibook。另外,您可能会发现《Haskell入门》中“数字”部分很有用。


根据此答案,使用Integer速度通常比速度更快
Maarten 2015年

6
@Maarten,这仅仅是因为Int64在32位系统上实现得很差。在64位系统上,它很棒。
dfeuer

21

IntBounded,这意味着您可以使用minBoundmaxBound找出限制,这些限制与实现有关,但保证至少保持[-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)


10

Int是C int,这意味着其值的范围是-2147483647至2147483647,而Integer范围是整个Z集的范围,这意味着它可以任意大。

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

注意Int文字的值。


2
GHCi版本7.10.3发出警告:文字12345678901234567890超出整数范围-922337203685477575808..9223372036854775807
亚当


4

将an Integer实现为一个,Int#直到它变得大于Int#可以存储的最大值。那时,这是GMP编号。


2
这听起来是特定于实现的。是否有引用说整数需要以这种方式实现?
yoniLavi

4
不,您是对的,这是GHC特有的。就是说,1. GHC是大多数人使用的,2.这是我想到的实现这种数据类型的最智能的方式。
Nate Symer

这是否意味着(在GHC中)没有使用性能的折衷Integer,因此Integer始终是更好的选择吗?
柯克·布罗德赫斯特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.