IntとIntegerの違いは何ですか?


回答:


183

「整数」は任意の精度の型です。マシンのメモリの制限まで、どんなに大きな数でも保持できます。つまり、算術オーバーフローが発生することはありません。一方、それはまたあなたの計算が比較的遅いことを意味します。Lispユーザーは、ここで「bignum」タイプを認識できます。

「Int」は、より一般的な32ビットまたは64ビットの整数です。実装はさまざまですが、少なくとも30ビットであることが保証されています。

出典:HaskellのWikibook。また、Haskellの穏やかな紹介の数字のセクションが役立つ場合もあります。


この回答によると、使用Integerは通常よりも速い
Maarten

6
@Maarten、それInt64は32ビットシステムでかなりひどく実装されているからです。64ビットシステムでは、これはすばらしいことです。
dfeuer 2016

21

IntisですBounded。つまり、実装に依存しますが、少なくとも[-2 29 .. 2 29 -1] を保持することが保証されている制限を使用minBoundmaxBoundて見つけることができます。

例えば:

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ですが、Zセット全体のIntegerの範囲は、任意に大きくすることができます。

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

Intリテラルの値に注意してください。


2
GHCi、バージョン7.10.3が警告を出す:リテラル12345678901234567890がIntの範囲外-9223372036854775808..9223372036854775807
Adam

5

Preludeは、最も基本的な数値型のみを定義します。固定サイズの整数(Int)、任意精度の整数(Integer)、...

...

有限精度整数型Intは、少なくとも[-2 ^ 29、2 ^ 29-1]の範囲をカバーします。

Haskellレポートから:http : //www.haskell.org/onlinereport/basic.html#numbers


4

Integer実装されInt#、それが最大値よりも大きくなるまで、Int#格納することができます。その時点で、それはGMP番号です。


2
これは実装固有に聞こえます。Integerをこの方法で実装する必要があるという言及はありますか?
yoniLavi

4
いいえ、そうです、これはGHC固有のものです。つまり、1。GHCはほとんどの人が使用するものです。2。これは、このようなデータ型を実装するために私が考えることができる最もインテリジェントな方法です。
Nate Symer

これは、(GHCでは)を使用することによるパフォーマンスのトレードオフがないことを意味するIntegerのでInteger、常により良いオプションですか?
カークブロードハースト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.