Int和Integer有什么区别?

0xA*_*xAX 161 int haskell integer numbers bignum

在Haskell中,a Int和an 之间有什么区别Integer?答案记录在哪里?

bca*_*cat 173

"整数"是一种任意精度类型:它可以保存任何数字,无论多大,直到机器内存的极限...... 这意味着你永远不会有算术溢出.另一方面,它也意味着你的算术相对较慢.Lisp用户可以在这里识别"bignum"类型.

"Int"是更常见的32位或64位整数.实现方式各不相同,但保证至少为30位.

资料来源:Haskell Wikibook.此外,您可能会发现HaskellA Gentle IntroductionNumbers部分很有用.

  • @Maarten,这只是因为`Int64`在32位系统上实现得相当糟糕.在64位系统上,它很棒. (6认同)

Nul*_*ion 19

Int是机器整数的类型,保证范围至少为-2 29到2 29 - 1,而Integer是任意精度整数,范围与内存一样大.

https://mail.haskell.org/pipermail/haskell-cafe/2005-May/009906.html


200*_*ess 19

IntBounded,这意味着你可以使用minBoundmaxBound找出限制,这些限制是依赖于实现的,但保证至少保持[-2 29 .. 2 29 -1].

例如:

Prelude> (minBound, maxBound) :: (Int, Int)
(-9223372036854775808,9223372036854775807)
Run Code Online (Sandbox Code Playgroud)

但是,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)
Run Code Online (Sandbox Code Playgroud)


Min*_*ang 10

Int是C int,这意味着它的值范围从-2147483647到2147483647,而整数Z设置的整数范围,也就是说,它可以是任意大的.

$ ghci
Prelude> (12345678901234567890 :: Integer, 12345678901234567890 :: Int)
(12345678901234567890,-350287150)
Run Code Online (Sandbox Code Playgroud)

注意Int文字的值.

  • GHCi,版本7.10.3发出警告:文字12345678901234567890超出Int范围-9223372036854775808..9223372036854775807 (2认同)

new*_*cct 5

Prelude只定义了最基本的数字类型:固定大小的整数(Int),任意精度整数(Integer),...

...

有限精度整数类型Int至少涵盖范围[ - 2 ^ 29,2 ^ 29 - 1].

来自Haskell的报告:http://www.haskell.org/onlinereport/basic.html#numbers


Nat*_*mer 5

AnInteger被实现为 an Int#,直到它大于 an 可以存储的最大值Int#。那时,它就是一个GMP编号。

  • 不,你是对的,这是 GHC 特定的。也就是说,1. GHC 是大多数人使用的,2. 这是我能想到的实现这种数据类型的最智能的方法。 (5认同)
  • 这听起来是特定于实现的。有参考文献说 Integer 需要这样实现吗? (2认同)