型とクラスを理解する過程のメモ

  • 自分の書いたものを消したいくらいだが、このメモは自分で書いた、というそれだけの理由で、自分にとっては価値があるので、残すことにする
  • 型とクラスを調べるために
    • どちらも":info"によって情報を示すことができる(この記事の末尾にそれぞれの表示を示した)
:info Int
:info Enum
  • 型とクラスとインスタンス
    • 型は互いに関連する値の集合である
    • 型の情報は次のように見る(Int型の場合)
:info Int
      • のように問いかけると
data Int = ...
...
instance Enum Int ...
instance Eq Int ...
...
      • のように"data Int"とあるように、「"Int"型として値を持たせる」ための「型」であって、
      • また、"instance Enum Int..."とあるように「"Int"型はクラスEnum,Eq,...に帰属して、Enum,Eq,...クラス内で定義された関数に引数として渡すことができる」と書かれている
      • これが、(データの)型から見た、クラス・インスタンスとの関係
    • 他方、クラスは共通のメソッドを提供する型の集合である
    • クラスの情報を表示するには次のようにする(Enumクラスの場合)
:info Enum
      • のように問いかけると
class Enum a where
  succ :: a -> a
  ...
instance Enum Ordering -- Defined in GHC.Enum
instance Enum Int -- Defined in GHC.Enum
...
      • のように"class Enum"とあるように「"Enum"クラスで」あって、
      • そこには、"succ :: a -> a"とあるように、「succという関数が定義して」あって、
      • また、"instance Enum Int"などとあるように、「型、Ordering,Int,...」に、Enumクラスの関数は適用できる」と書かれている
      • これが、クラスから見た、(データの)型・インスタンスとの関係
    • このように、(データの)型<-インスタンス->クラスという関係にある
      • したがって、「(データの)型はそれぞれのクラスとインスタンスで結ばれているかどうか」、という関係にある
      • 「(データの)型」は、「クラス(に対応する)集合」の要素かどうか、という関係にある
    • その関係を表にしたのが以下

  • 型(Preludeにある型〜基本となる型)
    • IO
    • IOError
    • Int
    • Integer
    • Float
    • Double
    • Char
    • Bool
    • Ordering
    • Maybe
    • () (ユニット)
    • [] (List)
    • (,) (Tuple)
    • 型変数 (aが良く使われる)は、どの型とも決めないけれど、型を扱うときに使われる
  • クラス(Preludeにあるクラス〜基本となるクラス)
    • Show
    • Read
    • Eq
    • Ord
    • Enum
    • Num
    • Real
    • Fractional
    • RealFrac
    • Floating
    • RealFloat
    • Integral
    • Bounded
    • Monad
    • MonadPlus
    • Functor
  • 型とクラスに関する簡単なコメント
      • IO
        • 他ととにかく違う。外部とのやりとりはとにかく別立て
        • Modad,MonadoPlus,Functorの集合の要素
      • IOError
        • IO的だけれど、エラーとして判定したり表示したりされる対象として、ある程度、他の型と重なる
        • Show,Read,Eqの集合の要素
      • Maybeと[](リスト)
        • Monad,MonadPlus,Functorの要素、Ordn要素。それ以外のクラスの集合の要素ではない
      • Char,Bool,Ordering
        • 数値を扱わないけれど、基本的なデータ型
        • 数値関係のクラス(Num,Real,Integral,RealFrac,Floating,RealFloat)とIO/Monad系のクラス以外のすべてのクラスの集合に属する
      • Int,Integer,Float,Double
        • 数値関係のクラス(Num,Realに属する)
        • 整数系のInt,IntegerはIntegralクラスの集合に属する
        • 非整数系のFloat,DoubleはRealFrac,Floating,RealFloatに属する
        • IntのみはBoundedに属する
      • タプル("(,)")
        • 少し特別。数値系とは限らないのでCharなどと似た帰属性質を持ち、Boundedにも属する。複数要素を束ねたものなので、Enumに属さない
      • ()
        • これは特殊、空、void。
    • クラス
      • Show,Read,Eq
        • 取扱い全般なので、IO型以外のすべてを対象とする
      • Ord
        • 全順序型データに対するクラス
        • 数値はもちろん、Char(文字コードは順序あり)やBoolも順序を入れて管理している
      • Enum
        • 同じ型の値をならべてその上の演算なので、単項の「値関係」の型を対象とする(値をまとめているリスト[]とタプル(,)は対象外、IOErrorとMaybe も対象外)
      • Bounded
        • 上下の極みを定義する。半順序な型(Ordering型は順序であって半順序ではない)を対象とする。無限大のInteger型や、値の付け方が指数表示だったりするFloat,Doubleには極みがないということで、このクラスに入らない(?)。タプル型("(,)")に極みがある(タプルの要素のそれぞれに極みを与える)のはちょっと後付っぽい感じ。ただしリスト[]に極みがないのは、リストの要素はすべて同じ型なので、その個々のようそに「極み」をつけるのは変だし、リストの要素の型が極みを持ちえない型である可能性もあるから(?)
      • Num,Real
        • 数値系。整数で閉じられる演算(除算は含まれない)
      • RealFloat,Floating,RealFloat
        • 除算もできる数体系が含まれる
      • Int,Integer
        • 整数には整数にしかできないことがあるので、取り立ててクラスにする
      • Monad,MonadPlus,Functor
        • 圏論的取扱いのクラス
        • 圏論的取扱いは、非関数型言語にはない。逆に言えば、非関数型言語でも使われるデータ型は、このクラスに属する必要はない
        • HaskellではIOをうまく扱うためにMonadをつかっているので、IO型がこのグループのクラスに属する
        • Maybeも型が決められなくならないような「工夫」としてMonad系に帰属する
        • リスト[]はHaskellでもろもろをうまく回すための基軸的なものであるので、Monad的な取扱いを実現するために選ばれた、「複数要素ハンドラー」として、このグループのクラスに帰属する
  • クラスについて補遺
    • 「同じか違うか」Eqクラス
    • 「大きいか小さいか(全順序)」Ordクラス
    • 「数値は、(自然数)→整数→有理数→実数→複素数、と拡大する」。コンピュータでは無理数は「十分に桁数の多い小数・有理数」として扱うので、本当のいみの実数はない。複素数は数値のペアとして表されるので、ここでは扱わない。群環体的に、除算について閉じているかどうかを考えることで数値に関する型は分類される
  • 型とクラス
    • 型の:info 表示
      • IO,IOErrorは他と違ってdataで始まっていないことからも、「特殊」であることがわかる
Prelude> :info IO
newtype IO a
  = GHC.Types.IO (GHC.Prim.State# GHC.Prim.RealWorld
                  -> (# GHC.Prim.State# GHC.Prim.RealWorld, a #))
  	-- Defined in GHC.Types
instance Monad IO -- Defined in GHC.Base
instance Functor IO -- Defined in GHC.Base
Prelude> :info IOError
type IOError = GHC.IO.Exception.IOException
  	-- Defined in GHC.IO.Exception
Prelude> :info 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.Base
instance Integral Int -- Defined in GHC.Real
instance Num Int -- Defined in GHC.Num
instance Ord Int -- Defined in GHC.Base
instance Read Int -- Defined in GHC.Read
instance Real Int -- Defined in GHC.Real
instance Show Int -- Defined in GHC.Show
Prelude> :info Integer
data Integer
  = integer-gmp:GHC.Integer.Type.S# GHC.Prim.Int#
  | integer-gmp:GHC.Integer.Type.J# GHC.Prim.Int# GHC.Prim.ByteArray#
  	-- Defined in integer-gmp:GHC.Integer.Type
instance Enum Integer -- Defined in GHC.Num
instance Eq Integer -- Defined in GHC.Classes
instance Integral Integer -- Defined in GHC.Real
instance Num Integer -- Defined in GHC.Num
instance Ord Integer -- Defined in GHC.Classes
instance Read Integer -- Defined in GHC.Read
instance Real Integer -- Defined in GHC.Real
instance Show Integer -- Defined in GHC.Num
Prelude> :info Float
data Float = GHC.Types.F# GHC.Prim.Float# 	-- Defined in GHC.Types
instance Enum Float -- Defined in GHC.Float
instance Eq Float -- Defined in GHC.Classes
instance Floating Float -- Defined in GHC.Float
instance Fractional Float -- Defined in GHC.Float

instance Num Float -- Defined in GHC.Float
instance Ord Float -- Defined in GHC.Classes
instance Read Float -- Defined in GHC.Read
instance Real Float -- Defined in GHC.Float
instance RealFloat Float -- Defined in GHC.Float
instance RealFrac Float -- Defined in GHC.Float
instance Show Float -- Defined in GHC.Float
Prelude> :info Float
data Float = GHC.Types.F# GHC.Prim.Float# 	-- Defined in GHC.Types
instance Enum Float -- Defined in GHC.Float
instance Eq Float -- Defined in GHC.Classes
instance Floating Float -- Defined in GHC.Float
instance Fractional Float -- Defined in GHC.Float

instance Num Float -- Defined in GHC.Float
instance Ord Float -- Defined in GHC.Classes
instance Read Float -- Defined in GHC.Read
instance Real Float -- Defined in GHC.Float
instance RealFloat Float -- Defined in GHC.Float
instance RealFrac Float -- Defined in GHC.Float
instance Show Float -- Defined in GHC.Float
Prelude> :info Double
data Double = GHC.Types.D# GHC.Prim.Double#
  	-- Defined in GHC.Types
instance Enum Double -- Defined in GHC.Float
instance Eq Double -- Defined in GHC.Classes
instance Floating Double -- Defined in GHC.Float
instance Fractional Double -- Defined in GHC.Float
instance Num Double -- Defined in GHC.Float
instance Ord Double -- Defined in GHC.Classes
instance Read Double -- Defined in GHC.Read
instance Real Double -- Defined in GHC.Float
instance RealFloat Double -- Defined in GHC.Float
instance RealFrac Double -- Defined in GHC.Float
instance Show Double -- Defined in GHC.Float
Prelude> :info Char
data Char = GHC.Types.C# GHC.Prim.Char# 	-- Defined in GHC.Types
instance Bounded Char -- Defined in GHC.Enum
instance Enum Char -- Defined in GHC.Enum
instance Eq Char -- Defined in GHC.Classes
instance Ord Char -- Defined in GHC.Classes
instance Read Char -- Defined in GHC.Read
instance Show Char -- Defined in GHC.Show
Prelude> :info Bool
data Bool = False | True 	-- Defined in GHC.Bool
instance Bounded Bool -- Defined in GHC.Enum
instance Enum Bool -- Defined in GHC.Enum
instance Eq Bool -- Defined in GHC.Classes
instance Ord Bool -- Defined in GHC.Classes
instance Read Bool -- Defined in GHC.Read
instance Show Bool -- Defined in GHC.Show
Prelude> :info Ordering
data Ordering = LT | EQ | GT 	-- Defined in GHC.Ordering
instance Bounded Ordering -- Defined in GHC.Enum
instance Enum Ordering -- Defined in GHC.Enum
instance Eq Ordering -- Defined in GHC.Classes
instance Ord Ordering -- Defined in GHC.Classes
instance Read Ordering -- Defined in GHC.Read
instance Show Ordering -- Defined in GHC.Show
Prelude> :info Maybe
data Maybe a = Nothing | Just a 	-- Defined in Data.Maybe
instance Eq a => Eq (Maybe a) -- Defined in Data.Maybe
instance Monad Maybe -- Defined in Data.Maybe
instance Functor Maybe -- Defined in Data.Maybe
instance Ord a => Ord (Maybe a) -- Defined in Data.Maybe
instance Read a => Read (Maybe a) -- Defined in GHC.Read
instance Show a => Show (Maybe a) -- Defined in GHC.Show
Prelude> :info []
data [] a = [] | a : [a] 	-- Defined in GHC.Types
instance Eq a => Eq [a] -- Defined in GHC.Classes
instance Monad [] -- Defined in GHC.Base
instance Functor [] -- Defined in GHC.Base
instance Ord a => Ord [a] -- Defined in GHC.Classes
instance Read a => Read [a] -- Defined in GHC.Read
instance Show a => Show [a] -- Defined in GHC.Show
Prelude> :info ()
data () = () 	-- Defined in GHC.Unit
instance Bounded () -- Defined in GHC.Enum
instance Enum () -- Defined in GHC.Enum
instance Eq () -- Defined in GHC.Classes
instance Ord () -- Defined in GHC.Classes
instance Read () -- Defined in GHC.Read
instance Show () -- Defined in GHC.Show
Prelude> :info (,)
data (,) a b = (,) a b 	-- Defined in GHC.Tuple
instance (Bounded a, Bounded b) => Bounded (a, b)
  -- Defined in GHC.Enum
instance (Eq a, Eq b) => Eq (a, b) -- Defined in GHC.Classes
instance (Ord a, Ord b) => Ord (a, b) -- Defined in GHC.Classes
instance (Read a, Read b) => Read (a, b) -- Defined in GHC.Read
instance (Show a, Show b) => Show (a, b) -- Defined in GHC.Show
Prelude> 
    • クラスの:info表示
      • タプル "(,)"のインスタンスの定義が要素数2,3,...,15のべた書きになっている(Haskellっぽくない)ことがわかる
      • "MonadPlus"クラスは…何か変
Prelude> :info Show
class Show a where
  showsPrec :: Int -> a -> ShowS
  show :: a -> String
  showList :: [a] -> ShowS
  	-- Defined in GHC.Show
instance (Show a, Show b) => Show (Either a b)
  -- Defined in Data.Either
instance Show a => Show [a] -- Defined in GHC.Show
instance Show Ordering -- Defined in GHC.Show
instance Show a => Show (Maybe a) -- Defined in GHC.Show
instance Show Int -- Defined in GHC.Show
instance Show Char -- Defined in GHC.Show
instance Show Bool -- Defined in GHC.Show
instance (Show a,
          Show b,
          Show c,
          Show d,
          Show e,
          Show f,
          Show g,
          Show h,
          Show i,
          Show j,
          Show k,
          Show l,
          Show m,
          Show n,
          Show o) =>
         Show (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)
  -- Defined in GHC.Show
instance (Show a,
          Show b,
          Show c,
          Show d,
          Show e,
          Show f,
          Show g,
          Show h,
          Show i,
          Show j,
          Show k,
          Show l,
          Show m,
          Show n) =>
         Show (a, b, c, d, e, f, g, h, i, j, k, l, m, n)
  -- Defined in GHC.Show
instance (Show a,
          Show b,
          Show c,
          Show d,
          Show e,
          Show f,
          Show g,
          Show h,
          Show i,
          Show j,
          Show k,
          Show l,
          Show m) =>
         Show (a, b, c, d, e, f, g, h, i, j, k, l, m)
  -- Defined in GHC.Show
instance (Show a,
          Show b,
          Show c,
          Show d,
          Show e,
          Show f,
          Show g,
          Show h,
          Show i,
          Show j,
          Show k,
          Show l) =>
         Show (a, b, c, d, e, f, g, h, i, j, k, l)
  -- Defined in GHC.Show
instance (Show a,
          Show b,
          Show c,
          Show d,
          Show e,
          Show f,
          Show g,
          Show h,
          Show i,
          Show j,
          Show k) =>
         Show (a, b, c, d, e, f, g, h, i, j, k)
  -- Defined in GHC.Show
instance (Show a,
          Show b,
          Show c,
          Show d,
          Show e,
          Show f,
          Show g,
          Show h,
          Show i,
          Show j) =>
         Show (a, b, c, d, e, f, g, h, i, j)
  -- Defined in GHC.Show
instance (Show a,
          Show b,
          Show c,
          Show d,
          Show e,
          Show f,
          Show g,
          Show h,
          Show i) =>
         Show (a, b, c, d, e, f, g, h, i)
  -- Defined in GHC.Show
instance (Show a,
          Show b,

          Show c,
          Show d,
          Show e,
          Show f,
          Show g,
          Show h) =>
         Show (a, b, c, d, e, f, g, h)
  -- Defined in GHC.Show
instance (Show a,
          Show b,
          Show c,
          Show d,
          Show e,
          Show f,
          Show g) =>
         Show (a, b, c, d, e, f, g)
  -- Defined in GHC.Show
instance (Show a, Show b, Show c, Show d, Show e, Show f) =>
         Show (a, b, c, d, e, f)
  -- Defined in GHC.Show
instance (Show a, Show b, Show c, Show d, Show e) =>
         Show (a, b, c, d, e)
  -- Defined in GHC.Show
instance (Show a, Show b, Show c, Show d) => Show (a, b, c, d)
  -- Defined in GHC.Show
instance (Show a, Show b, Show c) => Show (a, b, c)
  -- Defined in GHC.Show
instance (Show a, Show b) => Show (a, b) -- Defined in GHC.Show
instance Show () -- Defined in GHC.Show
instance Show Integer -- Defined in GHC.Num
instance Show Float -- Defined in GHC.Float
instance Show Double -- Defined in GHC.Float
Prelude> :info Read
class Read a where
  readsPrec :: Int -> ReadS a
  readList :: ReadS [a]
  GHC.Read.readPrec :: Text.ParserCombinators.ReadPrec.ReadPrec a
  GHC.Read.readListPrec ::
    Text.ParserCombinators.ReadPrec.ReadPrec [a]
  	-- Defined in GHC.Read
instance (Read a, Read b) => Read (Either a b)
  -- Defined in Data.Either
instance Read a => Read [a] -- Defined in GHC.Read
instance Read Ordering -- Defined in GHC.Read
instance Read a => Read (Maybe a) -- Defined in GHC.Read
instance Read Integer -- Defined in GHC.Read
instance Read Int -- Defined in GHC.Read
instance Read Float -- Defined in GHC.Read
instance Read Double -- Defined in GHC.Read
instance Read Char -- Defined in GHC.Read
instance Read Bool -- Defined in GHC.Read
instance (Read a,
          Read b,
          Read c,
          Read d,
          Read e,
          Read f,
          Read g,
          Read h,
          Read i,
          Read j,
          Read k,
          Read l,
          Read m,
          Read n,
          Read o) =>
         Read (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)
  -- Defined in GHC.Read
instance (Read a,
          Read b,
          Read c,
          Read d,
          Read e,
          Read f,
          Read g,
          Read h,
          Read i,
          Read j,
          Read k,
          Read l,
          Read m,
          Read n) =>
         Read (a, b, c, d, e, f, g, h, i, j, k, l, m, n)
  -- Defined in GHC.Read
instance (Read a,
          Read b,
          Read c,
          Read d,
          Read e,
          Read f,
          Read g,
          Read h,
          Read i,
          Read j,
          Read k,
          Read l,
          Read m) =>
         Read (a, b, c, d, e, f, g, h, i, j, k, l, m)
  -- Defined in GHC.Read
instance (Read a,
          Read b,
          Read c,
          Read d,
          Read e,
          Read f,
          Read g,
          Read h,
          Read i,
          Read j,
          Read k,
          Read l) =>
         Read (a, b, c, d, e, f, g, h, i, j, k, l)
  -- Defined in GHC.Read
instance (Read a,
          Read b,
          Read c,
          Read d,
          Read e,
          Read f,
          Read g,
          Read h,
          Read i,
          Read j,
          Read k) =>
         Read (a, b, c, d, e, f, g, h, i, j, k)
  -- Defined in GHC.Read
instance (Read a,
          Read b,
          Read c,
          Read d,
          Read e,
          Read f,
          Read g,
          Read h,
          Read i,
          Read j) =>
         Read (a, b, c, d, e, f, g, h, i, j)
  -- Defined in GHC.Read
instance (Read a,
          Read b,
          Read c,
          Read d,
          Read e,
          Read f,
          Read g,
          Read h,
          Read i) =>
         Read (a, b, c, d, e, f, g, h, i)
  -- Defined in GHC.Read
instance (Read a,
          Read b,
          Read c,
          Read d,
          Read e,
          Read f,
          Read g,
          Read h) =>
         Read (a, b, c, d, e, f, g, h)
  -- Defined in GHC.Read
instance (Read a,
          Read b,
          Read c,
          Read d,
          Read e,
          Read f,
          Read g) =>
         Read (a, b, c, d, e, f, g)
  -- Defined in GHC.Read
instance (Read a, Read b, Read c, Read d, Read e, Read f) =>
         Read (a, b, c, d, e, f)
  -- Defined in GHC.Read
instance (Read a, Read b, Read c, Read d, Read e) =>
         Read (a, b, c, d, e)
  -- Defined in GHC.Read
instance (Read a, Read b, Read c, Read d) => Read (a, b, c, d)
  -- Defined in GHC.Read
instance (Read a, Read b, Read c) => Read (a, b, c)
  -- Defined in GHC.Read
instance (Read a, Read b) => Read (a, b) -- Defined in GHC.Read
instance Read () -- Defined in GHC.Read
Prelude> :info Eq
class Eq a where
  (==) :: a -> a -> Bool
  (/=) :: a -> a -> Bool
  	-- Defined in GHC.Classes
instance Eq a => Eq (Maybe a) -- Defined in Data.Maybe
instance (Eq a, Eq b) => Eq (Either a b) -- Defined in Data.Either
instance Eq a => Eq [a] -- Defined in GHC.Classes
instance Eq Ordering -- Defined in GHC.Classes
instance Eq Integer -- Defined in GHC.Classes
instance Eq Float -- Defined in GHC.Classes
instance Eq Double -- Defined in GHC.Classes
instance Eq Char -- Defined in GHC.Classes
instance Eq Bool -- Defined in GHC.Classes
instance (Eq a,
          Eq b,
          Eq c,
          Eq d,
          Eq e,
          Eq f,
          Eq g,
          Eq h,
          Eq i,
          Eq j,
          Eq k,
          Eq l,
          Eq m,

          Eq n,
          Eq o) =>
         Eq (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)
  -- Defined in GHC.Classes
instance (Eq a,
          Eq b,
          Eq c,
          Eq d,
          Eq e,
          Eq f,
          Eq g,
          Eq h,
          Eq i,
          Eq j,
          Eq k,
          Eq l,
          Eq m,
          Eq n) =>
         Eq (a, b, c, d, e, f, g, h, i, j, k, l, m, n)
  -- Defined in GHC.Classes
instance (Eq a,
          Eq b,
          Eq c,
          Eq d,
          Eq e,
          Eq f,
          Eq g,
          Eq h,
          Eq i,
          Eq j,
          Eq k,
          Eq l,
          Eq m) =>
         Eq (a, b, c, d, e, f, g, h, i, j, k, l, m)
  -- Defined in GHC.Classes
instance (Eq a,
          Eq b,
          Eq c,
          Eq d,
          Eq e,
          Eq f,
          Eq g,
          Eq h,
          Eq i,
          Eq j,
          Eq k,
          Eq l) =>
         Eq (a, b, c, d, e, f, g, h, i, j, k, l)
  -- Defined in GHC.Classes
instance (Eq a,
          Eq b,
          Eq c,
          Eq d,
          Eq e,
          Eq f,
          Eq g,
          Eq h,
          Eq i,
          Eq j,
          Eq k) =>
         Eq (a, b, c, d, e, f, g, h, i, j, k)
  -- Defined in GHC.Classes
instance (Eq a,
          Eq b,
          Eq c,
          Eq d,
          Eq e,
          Eq f,
          Eq g,
          Eq h,
          Eq i,
          Eq j) =>
         Eq (a, b, c, d, e, f, g, h, i, j)
  -- Defined in GHC.Classes
instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g, Eq h, Eq i) =>
         Eq (a, b, c, d, e, f, g, h, i)
  -- Defined in GHC.Classes
instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g, Eq h) =>
         Eq (a, b, c, d, e, f, g, h)
  -- Defined in GHC.Classes
instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g) =>
         Eq (a, b, c, d, e, f, g)
  -- Defined in GHC.Classes
instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f) =>
         Eq (a, b, c, d, e, f)
  -- Defined in GHC.Classes
instance (Eq a, Eq b, Eq c, Eq d, Eq e) => Eq (a, b, c, d, e)
  -- Defined in GHC.Classes
instance (Eq a, Eq b, Eq c, Eq d) => Eq (a, b, c, d)
  -- Defined in GHC.Classes
instance (Eq a, Eq b, Eq c) => Eq (a, b, c)
  -- Defined in GHC.Classes
instance (Eq a, Eq b) => Eq (a, b) -- Defined in GHC.Classes
instance Eq () -- Defined in GHC.Classes
instance Eq Int -- Defined in GHC.Base
Prelude> :info Ord
class Eq a => Ord a where
  compare :: a -> a -> Ordering
  (<) :: a -> a -> Bool
  (>=) :: a -> a -> Bool
  (>) :: a -> a -> Bool
  (<=) :: a -> a -> Bool
  max :: a -> a -> a
  min :: a -> a -> a
  	-- Defined in GHC.Classes
instance Ord a => Ord (Maybe a) -- Defined in Data.Maybe
instance (Ord a, Ord b) => Ord (Either a b)
  -- Defined in Data.Either
instance Ord a => Ord [a] -- Defined in GHC.Classes
instance Ord Ordering -- Defined in GHC.Classes
instance Ord Integer -- Defined in GHC.Classes
instance Ord Float -- Defined in GHC.Classes
instance Ord Double -- Defined in GHC.Classes
instance Ord Char -- Defined in GHC.Classes
instance Ord Bool -- Defined in GHC.Classes
instance (Ord a,
          Ord b,
          Ord c,
          Ord d,
          Ord e,
          Ord f,
          Ord g,
          Ord h,
          Ord i,
          Ord j,
          Ord k,
          Ord l,
          Ord m,
          Ord n,
          Ord o) =>
         Ord (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)
  -- Defined in GHC.Classes
instance (Ord a,
          Ord b,
          Ord c,
          Ord d,
          Ord e,
          Ord f,
          Ord g,
          Ord h,
          Ord i,
          Ord j,
          Ord k,
          Ord l,
          Ord m,
          Ord n) =>
         Ord (a, b, c, d, e, f, g, h, i, j, k, l, m, n)
  -- Defined in GHC.Classes
instance (Ord a,
          Ord b,
          Ord c,
          Ord d,
          Ord e,
          Ord f,
          Ord g,
          Ord h,
          Ord i,
          Ord j,
          Ord k,
          Ord l,
          Ord m) =>
         Ord (a, b, c, d, e, f, g, h, i, j, k, l, m)
  -- Defined in GHC.Classes
instance (Ord a,
          Ord b,
          Ord c,
          Ord d,
          Ord e,
          Ord f,
          Ord g,
          Ord h,
          Ord i,
          Ord j,
          Ord k,
          Ord l) =>
         Ord (a, b, c, d, e, f, g, h, i, j, k, l)
  -- Defined in GHC.Classes
instance (Ord a,
          Ord b,
          Ord c,
          Ord d,
          Ord e,
          Ord f,
          Ord g,
          Ord h,
          Ord i,
          Ord j,
          Ord k) =>
         Ord (a, b, c, d, e, f, g, h, i, j, k)
  -- Defined in GHC.Classes
instance (Ord a,
          Ord b,
          Ord c,
          Ord d,
          Ord e,
          Ord f,
          Ord g,
          Ord h,
          Ord i,
          Ord j) =>
         Ord (a, b, c, d, e, f, g, h, i, j)
  -- Defined in GHC.Classes
instance (Ord a,
          Ord b,
          Ord c,
          Ord d,
          Ord e,
          Ord f,
          Ord g,
          Ord h,
          Ord i) =>
         Ord (a, b, c, d, e, f, g, h, i)
  -- Defined in GHC.Classes
instance (Ord a,
          Ord b,
          Ord c,
          Ord d,
          Ord e,
          Ord f,
          Ord g,
          Ord h) =>
         Ord (a, b, c, d, e, f, g, h)
  -- Defined in GHC.Classes
instance (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g) =>
         Ord (a, b, c, d, e, f, g)
  -- Defined in GHC.Classes
instance (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f) =>
         Ord (a, b, c, d, e, f)
  -- Defined in GHC.Classes
instance (Ord a, Ord b, Ord c, Ord d, Ord e) => Ord (a, b, c, d, e)
  -- Defined in GHC.Classes
instance (Ord a, Ord b, Ord c, Ord d) => Ord (a, b, c, d)
  -- Defined in GHC.Classes
instance (Ord a, Ord b, Ord c) => Ord (a, b, c)
  -- Defined in GHC.Classes
instance (Ord a, Ord b) => Ord (a, b) -- Defined in GHC.Classes
instance Ord () -- Defined in GHC.Classes
instance Ord Int -- Defined in GHC.Base
Prelude> :info Enum
class Enum a where
  succ :: a -> a
  pred :: a -> a
  toEnum :: Int -> a
  fromEnum :: a -> Int
  enumFrom :: a -> [a]
  enumFromThen :: a -> a -> [a]
  enumFromTo :: a -> a -> [a]
  enumFromThenTo :: a -> a -> a -> [a]
  	-- Defined in GHC.Enum
instance Enum Ordering -- Defined in GHC.Enum
instance Enum Int -- Defined in GHC.Enum
instance Enum Char -- Defined in GHC.Enum
instance Enum Bool -- Defined in GHC.Enum
instance Enum () -- Defined in GHC.Enum
instance Enum Integer -- Defined in GHC.Num
instance Enum Float -- Defined in GHC.Float
instance Enum Double -- Defined in GHC.Float
Prelude> :info Num
class (Eq a, Show a) => Num a where
  (+) :: a -> a -> a
  (*) :: a -> a -> a
  (-) :: a -> a -> a
  negate :: a -> a
  abs :: a -> a
  signum :: a -> a
  fromInteger :: Integer -> a
  	-- Defined in GHC.Num
instance Num Integer -- Defined in GHC.Num
instance Num Int -- Defined in GHC.Num
instance Num Float -- Defined in GHC.Float
instance Num Double -- Defined in GHC.Float
Prelude> :info Real
class (Num a, Ord a) => Real a where toRational :: a -> Rational
  	-- Defined in GHC.Real
instance Real Integer -- Defined in GHC.Real
instance Real Int -- Defined in GHC.Real
instance Real Float -- Defined in GHC.Float
instance Real Double -- Defined in GHC.Float
Prelude> :info Fractional
class Num a => Fractional a where
  (/) :: a -> a -> a
  recip :: a -> a
  fromRational :: Rational -> a
  	-- Defined in GHC.Real
instance Fractional Float -- Defined in GHC.Float
instance Fractional Double -- Defined in GHC.Float
Prelude> :info RealFrac
class (Real a, Fractional a) => RealFrac a where
  properFraction :: Integral b => a -> (b, a)
  truncate :: Integral b => a -> b
  round :: Integral b => a -> b
  ceiling :: Integral b => a -> b
  floor :: Integral b => a -> b
  	-- Defined in GHC.Real
instance RealFrac Float -- Defined in GHC.Float
instance RealFrac Double -- Defined in GHC.Float
Prelude> :info Integral
class (Real a, Enum a) => Integral a where
  quot :: a -> a -> a
  rem :: a -> a -> a
  div :: a -> a -> a
  mod :: a -> a -> a
  quotRem :: a -> a -> (a, a)
  divMod :: a -> a -> (a, a)
  toInteger :: a -> Integer
  	-- Defined in GHC.Real
instance Integral Integer -- Defined in GHC.Real
instance Integral Int -- Defined in GHC.Real
Prelude> :info Bounded
class Bounded a where
  minBound :: a
  maxBound :: a
  	-- Defined in GHC.Enum
instance Bounded Ordering -- Defined in GHC.Enum
instance Bounded Int -- Defined in GHC.Enum
instance Bounded Char -- Defined in GHC.Enum
instance Bounded Bool -- Defined in GHC.Enum
instance (Bounded a,
          Bounded b,
          Bounded c,
          Bounded d,
          Bounded e,
          Bounded f,
          Bounded g,
          Bounded h,
          Bounded i,
          Bounded j,
          Bounded k,
          Bounded l,
          Bounded m,
          Bounded n,
          Bounded o) =>
         Bounded (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)
  -- Defined in GHC.Enum
instance (Bounded a,
          Bounded b,
          Bounded c,
          Bounded d,
          Bounded e,
          Bounded f,
          Bounded g,
          Bounded h,
          Bounded i,
          Bounded j,

          Bounded k,
          Bounded l,
          Bounded m,
          Bounded n) =>
         Bounded (a, b, c, d, e, f, g, h, i, j, k, l, m, n)
  -- Defined in GHC.Enum
instance (Bounded a,
          Bounded b,
          Bounded c,
          Bounded d,
          Bounded e,
          Bounded f,
          Bounded g,
          Bounded h,
          Bounded i,
          Bounded j,
          Bounded k,
          Bounded l,
          Bounded m) =>
         Bounded (a, b, c, d, e, f, g, h, i, j, k, l, m)
  -- Defined in GHC.Enum
instance (Bounded a,
          Bounded b,
          Bounded c,
          Bounded d,
          Bounded e,
          Bounded f,
          Bounded g,
          Bounded h,
          Bounded i,
          Bounded j,
          Bounded k,
          Bounded l) =>
         Bounded (a, b, c, d, e, f, g, h, i, j, k, l)
  -- Defined in GHC.Enum
instance (Bounded a,
          Bounded b,
          Bounded c,
          Bounded d,
          Bounded e,
          Bounded f,
          Bounded g,
          Bounded h,
          Bounded i,
          Bounded j,
          Bounded k) =>
         Bounded (a, b, c, d, e, f, g, h, i, j, k)
  -- Defined in GHC.Enum
instance (Bounded a,
          Bounded b,
          Bounded c,
          Bounded d,
          Bounded e,
          Bounded f,
          Bounded g,
          Bounded h,
          Bounded i,
          Bounded j) =>
         Bounded (a, b, c, d, e, f, g, h, i, j)
  -- Defined in GHC.Enum
instance (Bounded a,
          Bounded b,
          Bounded c,
          Bounded d,
          Bounded e,
          Bounded f,
          Bounded g,
          Bounded h,
          Bounded i) =>
         Bounded (a, b, c, d, e, f, g, h, i)
  -- Defined in GHC.Enum
instance (Bounded a,
          Bounded b,
          Bounded c,
          Bounded d,
          Bounded e,
          Bounded f,
          Bounded g,
          Bounded h) =>
         Bounded (a, b, c, d, e, f, g, h)
  -- Defined in GHC.Enum
instance (Bounded a,
          Bounded b,
          Bounded c,
          Bounded d,
          Bounded e,
          Bounded f,
          Bounded g) =>
         Bounded (a, b, c, d, e, f, g)
  -- Defined in GHC.Enum
instance (Bounded a,
          Bounded b,
          Bounded c,
          Bounded d,
          Bounded e,
          Bounded f) =>
         Bounded (a, b, c, d, e, f)
  -- Defined in GHC.Enum
instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e) =>
         Bounded (a, b, c, d, e)
  -- Defined in GHC.Enum
instance (Bounded a, Bounded b, Bounded c, Bounded d) =>
         Bounded (a, b, c, d)
  -- Defined in GHC.Enum
instance (Bounded a, Bounded b, Bounded c) => Bounded (a, b, c)
  -- Defined in GHC.Enum
instance (Bounded a, Bounded b) => Bounded (a, b)
  -- Defined in GHC.Enum
instance Bounded () -- Defined in GHC.Enum
Prelude> :info Monad
class Monad m where
  (>>=) :: m a -> (a -> m b) -> m b
  (>>) :: m a -> m b -> m b
  return :: a -> m a
  fail :: String -> m a
  	-- Defined in GHC.Base
instance Monad Maybe -- Defined in Data.Maybe
instance Monad [] -- Defined in GHC.Base
instance Monad IO -- Defined in GHC.Base
Prelude> :info MonadPlus

Top level: Not in scope: data constructor `MonadPlus'
Prelude> :info Functor
class Functor f where
  fmap :: (a -> b) -> f a -> f b
  (GHC.Base.<$) :: a -> f b -> f a
  	-- Defined in GHC.Base
instance Functor Maybe -- Defined in Data.Maybe
instance Functor [] -- Defined in GHC.Base
instance Functor IO -- Defined in GHC.Base