Int と Integer

Int はオーバーフローを起こす。


Prelude> :set +t
Prelude> (2 :: Int) ^ (32 :: Int)
0
it :: Int
Prelude> (2 :: Int) ^ (31 :: Int)
-2147483648
it :: Int

Integer はオーバーフローを起こさない。


Prelude> (2 :: Integer) ^ (31 :: Integer)
2147483648
it :: Integer
Prelude> (2 :: Integer) ^ (32 :: Integer)
4294967296
it :: Integer
Prelude> (2 :: Integer) ^ (64 :: Integer)
18446744073709551616
it :: Integer

Integer はメモリの許す限りオーバーフローを起こさない。


Prelude> (2 :: Integer) ^ (128 :: Integer)
340282366920938463463374607431768211456
it :: Integer
Prelude> (2 :: Integer) ^ (256 :: Integer)
115792089237316195423570985008687907853269984665640564039457584007913129639936
it :: Integer