Haskellにおける型と型クラス
昨年からプログラミングHaskellを読み進めているのですが、型と型クラスについての理解が曖昧なことに気づいたので、これまで勉強してきたことを整理してみました。
特に、OOP言語におけるクラスとHaskellの型クラスは(名前が同じこともあり)、混同しやすい部分だと思うので、この機会に違いを理解して先に進みたいと思います。
型とは
互いに関連する値の集合
例えば、Bool型はFalseとTrueという2つの真理値を含む集合
同じように、「Bool -> Bool」型は、Bool型をBool型へ変換するような全ての関数を含む集合(関数の例: notなど)
Haskellに標準で用意されている基本型をいくつか挙げる
Bool型
FalseとTrueという二つの真理値が含まれる型
Char型
Unicodeの全ての単一文字が値として含まれる型
String型
"abc", "1+2=3", ""(空文字列)のような文字の並びが値として含まれる型
関数型
例えば 「T1 -> T2」は、型T1を引数として受け取って型T2の返り値に変換する関数の型(つまり、型T1を型T2へ変換するような全ての関数を含む集合)
型クラス(または単にクラス)とは
何らかの振る舞いを定義するインターフェイス
ある型クラスのインスタンスである型は、その型クラスが記述する振る舞いを実装する
見方を変えると、ある型クラスは、その型クラスが定義する振る舞いを実装している型の集合と言うこともできる(と思う)
オブジェクト志向のクラスとは意味が大きく異なる
Haskellに標準で用意されている基本クラスをいくつか挙げる
Eqクラス
以下2つのメソッドを使って同等と不等を比較できる値を持つ型、の集合
(==) :: a -> a -> Bool (/=) :: a -> a -> Bool
-- Bool, Char, String, Int, Integer, ...etc といった基本型は、全てEqクラスのインスタンス > False == False True > 'a' == 'b' False > "abc" == "abc" True
Ordクラス
Eqクラスのインスタンスであることに加えて、順序づけられる値を持つ型、の集合 この型クラスに属する(つまりOrdクラスのインスタンスである)型の値は、以下6つのメソッドを用いて比較や処理ができる
(<) :: a -> a -> Bool (<=) :: a -> a -> Bool (>) :: a -> a -> Bool (>=) :: a -> a -> Bool min :: a -> a -> a max :: a -> a -> a
-- Bool, Char, String, Int, Integer, ...etc といった基本型は全てOrdクラスのインスタンス > False < True True > min 'a' 'b' 'a' > "elegant" < "elephant" True
型クラスは抽象的なインターフェイスとして定義されているので、1つの型はいくつもの型クラスのインスタンスになることができる(CharはEqクラスやOrdクラスのインスタンスである)
同様に、1つの型クラスはいくつもの型をインスタンスとして持つことができる(EqクラスはBool, Char, Stringなど複数の型をインスタンスとして持っている)