web-dev-qa-db-ja.com

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

Haskellでは、IntIntegerの違いは何ですか?答えはどこに文書化されていますか?

156
0xAX

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

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

ソース: The Haskell Wikibook 。また、Haskellの優しい紹介Numbers セクションが役立つかもしれません。

168
bcat

IntBoundedです。つまり、minBoundおよびmaxBoundを使用して、実装に依存しますが、少なくとも[-229 .. 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)
19
200_success

Intはマシン整数のタイプであり、少なくとも-2の範囲が保証されています29 2へ29 -1、(Integerは任意の精度の整数で、メモリの範囲と同じ大きさです。

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

19

IntはC intであり、その値の範囲は-2147483647〜2147483647であり、整数範囲はZ全体から設定されます。つまり、任意に大きくすることができます。

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

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

10
Ming-Tang

プレリュードは、最も基本的な数値タイプのみを定義します:固定サイズの整数(Int)、任意精度の整数(Integer)、...

...

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

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

5
newacct

Integerは、Int#が保存できる最大値より大きくなるまで、Int#として実装されます。その時点で、それは GMP 番号です。

4
Nate Symer

整数は、オーバーフローの結果としての未定義の動作による制約を受けないため、より積極的な最適化を可能にします。

すなわち、コンパイラーは、記述された式が未定義の動作を経験することは決してないと仮定しなければならず、コンパイラーが導入する潜在的な最適化は新しい未定義の動作も導入しないと仮定します。

または別の方法

a - (b - c)(a + c) - bと代数的に同等ですが、中間値a + cが元のオーバーフローを引き起こさない入力でオーバーフローする可能性があるため、コンパイラはその再配置を行うことができません。

0
Famous Jameis