【问题标题】:What is the difference between Int and Integer?Int 和 Integer 有什么区别?
【发布时间】:2011-03-26 15:36:32
【问题描述】:

在 Haskell 中,IntInteger 有什么区别?答案记录在哪里?

【问题讨论】:

    标签: haskell numbers integer int bignum


    【解决方案1】:

    Int 是机器整数的类型, 至少有保证范围 -229 到 229 - 1,而 Integer 是任意精度整数,具有 范围与您的内存一样大。

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

    【讨论】:

      【解决方案2】:

      “整数”是任意精度 类型:它将保存任何数字 不管多大,到极限 你机器的内存……这意味着你从来没有 算术溢出。在另一 手这也意味着你的算术是 比较慢。 Lisp 用户可以 在这里识别“bignum”类型。

      “Int”是更常见的 32 位或 64 位 整数。实现方式不同, 虽然它保证在 至少 30 位。

      来源:The Haskell Wikibook。此外,您可能会发现 Haskell 简介 中的 Numbers 部分很有用。

      【讨论】:

      • 根据this answer,使用Integer通常比is快
      • @Maarten,这只是因为Int64 在 32 位系统上的实现相当糟糕。在 64 位系统上,这很棒。
      【解决方案3】:

      Int 是 C 的 int,表示它的取值范围是 -2147483647 到 2147483647, 而整个 Z 集合中的 Integer 范围,这意味着它可以任意大。

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

      注意 Int 字面量的值。

      【讨论】:

      • GHCi,版本 7.10.3 给出警告:文字 12345678901234567890 超出 Int 范围 -9223372036854775808..9223372036854775807
      【解决方案4】:

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

      ...

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

          • 这听起来是特定于实现的。是否有参考说 Integer 需要以这种方式实现?
          • 不,你是对的,这是特定于 GHC 的。也就是说,1. GHC 是大多数人使用的,2. 这是我能想到的实现这种数据类型的最智能的方式。
          • 这是否意味着(在 GHC 中)使用Integer 没有性能折衷,因此Integer 总是更好的选择?
          猜你喜欢
          • 2015-01-29
          • 2013-09-21
          • 2010-11-19
          • 2010-10-15
          • 2010-09-05
          • 1970-01-01
          • 2013-10-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多