読者です 読者をやめる 読者になる 読者になる

IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

IntとIntegerの違い

IntIntegerとの違い

インスタンスの確認

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