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

takafumi blog

日々の勉強メモ

【Haskell】 言葉の定義まとめ(型クラス、型コンストラクタ、値コンストラクタ、型引数など)

Haskell

環境   ghc 7.8.3 CentOS7.0

「すごいHaskellたのしく学ぼう!」第07章 メモ

この辺で、言葉の定義がよくわからなくなっていたので、まとめてみた。


言葉 説明
型変数 関数の明示的な型宣言に使われる
どんな型も取り得る事を意味する
head :: [a] -> a
この「a」の事を型変数とよぶ
型クラス 何らかの振る舞いを定義するインターフェース class Eq a where
この「Eq」を型クラスと呼ぶ
インスタンス 型クラスが記述する振る舞いを実装したもの instance Eq a where
型aをEqのインスタンスとして実装する
型クラス制約 関数定義の際に、型変数に対して型クラスのインスタンスである事を定義する (==) :: Eq a => a -> a -> Bool
このとき「Eq a =>」が型クラス制約となる
aはEq型クラスのインスタンスである必要がある
型注釈 式が取るべき型を、明示的に指示する事 read "5" :: Int
「:: Int」の部分を型注釈とよぶ
データ型 Bool, Int, Char, Maybeなど、データを扱うための形式を定めたもの data Bool = False | True
Boolデータ型の定義
コンストラクタ データ型定義の、実際に型が取り得る値の種類を指定する data Bool = False | True
この「=」の右側を値コンストラクタと呼ぶ
コンストラクタ データ型定義で、型を引数に取って新しい型をつくる
この引数は型引数と呼ばれる
data Bool = False | True
この「=」の左側を型コンストラクタと呼ぶ
型引数 コンストラクタがとる引数 data Maybe a = Nothing | Just a
この「a」の事を型引数とよぶ
型シノニム ある(データ)型に別名をつける事ができる type String = [Char]
この「String」が型シノニム
単純に型と呼んだときは、データ型の事

▽関数定義
--   型クラス制約
--    ↓
fn :: Eq a => [a] -> a
--            ↑
--            型変数
fn ... -- 実装
▽データ型定義
--   型コンストラクタ     値コンストラクタ
--   ↓                   ↓
data Maybe a          =   Nothing | Just
--         ↑
--         型引数
▽型シノニム
type String = [Char]
--   ↑
--   型シノニム
▽型注釈
read "5" :: Int
--       ↑
--       型注釈

▽型クラス定義

class Foo a where
    (:-:) :: a -> a -> Bool -- 記号関数の場合は丸括弧で括る
    bar :: a -> a -> Bool

▽インタンス化

-- 型クラス定義にある関数を全て実装する事で、
-- あるデータ型を、型クラスのインタンスとする事ができる
instance Foo (Maybe m) where
    (:-:) (Just _) = True
    (:-:) Nothing  = False
    bar (Just _) = False
    bar Nothing  = True

-- この型引数「a」に対して型クラス制約を以下のように入れる事もできる
instance (Eq m) => Foo (Maybe m) where
    (:-:) (Just _) = True
    (:-:) Nothing  = False
    bar (Just _) = False
    bar Nothing  = True

takafumi-s.hatenablog.com