takafumi blog

日々の勉強メモ

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型クラスのインスタンスになる必要がある。


takafumi-s.hatenablog.com