Haskellでは、Int
とInteger
の違いは何ですか?答えはどこに文書化されていますか?
「整数」は任意の精度の型です。マシンのメモリの制限まで、どんなに大きな数値でも保持できます。これは、算術オーバーフローがないことを意味します。一方、算術演算が比較的遅いことも意味します。 LISPユーザーはここで「bignum」タイプを認識できます。
「Int」は、より一般的な32または64ビット整数です。実装はさまざまですが、少なくとも30ビットであることが保証されています。
ソース: The Haskell Wikibook 。また、Haskellの優しい紹介の Numbers セクションが役立つかもしれません。
Int
はBounded
です。つまり、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)
Intはマシン整数のタイプであり、少なくとも-2の範囲が保証されています29 2へ29 -1、(Integerは任意の精度の整数で、メモリの範囲と同じ大きさです。
https://mail.haskell.org/pipermail/haskell-cafe/2005-May/009906.html
IntはC intであり、その値の範囲は-2147483647〜2147483647であり、整数範囲はZ全体から設定されます。つまり、任意に大きくすることができます。
$ ghci
Prelude> (12345678901234567890 :: Integer, 12345678901234567890 :: Int)
(12345678901234567890,-350287150)
Intリテラルの値に注意してください。
プレリュードは、最も基本的な数値タイプのみを定義します:固定サイズの整数(Int)、任意精度の整数(Integer)、...
...
有限精度整数型Intは、少なくとも[-2 ^ 29、2 ^ 29-1]の範囲をカバーします。
haskellレポートから: http://www.haskell.org/onlinereport/basic.html#numbers
Integer
は、Int#
が保存できる最大値より大きくなるまで、Int#
として実装されます。その時点で、それは GMP 番号です。
整数は、オーバーフローの結果としての未定義の動作による制約を受けないため、より積極的な最適化を可能にします。
すなわち、コンパイラーは、記述された式が未定義の動作を経験することは決してないと仮定しなければならず、コンパイラーが導入する潜在的な最適化は新しい未定義の動作も導入しないと仮定します。
または別の方法
式a - (b - c)
は(a + c) - b
と代数的に同等ですが、中間値a + c
が元のオーバーフローを引き起こさない入力でオーバーフローする可能性があるため、コンパイラはその再配置を行うことができません。