IntとIntegerの違い
Int
とInteger
との違い
インスタンスの確認
Prelude > :i Int data Int = GHC.Types.I# GHC.Prim.Int# -- Defined in ‘GHC.Types’ instance Bounded Int -- Defined in ‘GHC.Enum’ instance Enum Int -- Defined in ‘GHC.Enum’ instance Eq Int -- Defined in ‘GHC.Classes’ instance Integral Int -- Defined in ‘GHC.Real’ instance Num Int -- Defined in ‘GHC.Num’ instance Ord Int -- Defined in ‘GHC.Classes’ instance Read Int -- Defined in ‘GHC.Read’ instance Real Int -- Defined in ‘GHC.Real’ instance Show Int -- Defined in ‘GHC.Show’
Prelude > :i Integer data Integer = integer-gmp-1.0.0.1:GHC.Integer.Type.S# !GHC.Prim.Int# | integer-gmp-1.0.0.1:GHC.Integer.Type.Jp# {-# UNPACK #-}integer-gmp-1.0.0.1:GHC.Integer.Type.BigNat | integer-gmp-1.0.0.1:GHC.Integer.Type.Jn# {-# UNPACK #-}integer-gmp-1.0.0.1:GHC.Integer.Type.BigNat -- Defined in ‘integer-gmp-1.0.0.1:GHC.Integer.Type’ instance Enum Integer -- Defined in ‘GHC.Enum’ instance Eq Integer -- Defined in ‘integer-gmp-1.0.0.1:GHC.Integer.Type’ instance Integral Integer -- Defined in ‘GHC.Real’ instance Num Integer -- Defined in ‘GHC.Num’ instance Ord Integer -- Defined in ‘integer-gmp-1.0.0.1:GHC.Integer.Type’ instance Read Integer -- Defined in ‘GHC.Read’ instance Real Integer -- Defined in ‘GHC.Real’ instance Show Integer -- Defined in ‘GHC.Show’
Bounded
クラスのインスタンスになっているのがInt
で、一方、IntegerはBoundedクラスのインスタンスではない。
Bounded
を確認してみると。Integer
には最大値(maxBound
)がないことがわかる。
Prelude > maxBound :: Int 9223372036854775807 Prelude > maxBound :: Integer <interactive>:11:1: error: • No instance for (Bounded Integer) arising from a use of ‘maxBound’ • In the expression: maxBound :: Integer In an equation for ‘it’: it = maxBound :: Integer
Intの最大値(9223372036854775807)の型を確認する。
Prelude > 9223372036854775807 :: Integer 9223372036854775807 Prelude > 9223372036854775807 :: Int 9223372036854775807
Intの最大値から+1の(9223372036854775807+1)の型を確認する。
Prelude > 9223372036854775808 :: Integer 9223372036854775808 Prelude > 9223372036854775808 :: Int <interactive>:15:1: warning: [-Woverflowed-literals] Literal 9223372036854775808 is out of the Int range -9223372036854775808..9223372036854775807 If you are trying to write a large negative literal, use NegativeLiterals -9223372036854775808