Haskell 型クラス、型クラス制約、型注釈など
環境 ghc 7.8.3 CentOS7.0
「すごいHaskellたのしく学ぼう!」メモ
読了:第02章まで
型変数
ghci> :t head head :: [a] -> a
このaを型変数と呼ぶ。 どんな型も取り得るという事を意味する。
型クラス
何らかの振る舞いを定義するインターフェース。
具体的には関数の集まりを定めている。 その型クラスに属する関数のことを、型クラスのメソッドと呼ぶ。 以下の例では、Eqが型クラス、(==)がメソッドとなる。
ghci> :i Eq class Eq a where (==) :: a -> a -> Bool (/=) :: a -> a -> Bool -- Defined in ‘GHC.Classes’
代表的な型クラスは Eq, Ord, Show, Read, Enum, Bounded, Num, Floating, Integral など。
型
クラスのインスタンスが、型となる。
ghci> :t (==) (==) :: Eq a => a -> a -> Bool
例として(==)はEq型クラスのインスタンスaを、2つ受け取る。という意味になる。
型クラス制約
ghci> :t (==) (==) :: Eq a => a -> a -> Bool
この例の「Eq a =>」の部分を型クラス制約と呼ぶ。 これはaがEq型クラスのインスタンス(つまりEq型)でなくてはならないと定めている。
型注釈
式が取るべき型を、明示的に指示する手段。 式の終わりに::を追加し型を指定。
ghci> read "5" :: Int 5 ghci> read "5" :: Float 5.0 ghci> read "[1,2,3,4]" :: [Int] [1,2,3,4] ghci> read "(3, 'a')" :: (Int, Char) (3, 'a')
型クラスのインスタンスにする
型をある型クラスのインスタンスにするために、いったん別のインスタンスにする必要がある。
ghci> :i 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’
この例では、Ord型クラスがEq型クラスのインスタンスである必要がわかる。 そのため、Ord型クラスのインスタンスになるには、先にEq型クラスのインスタンスになる必要がある。