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など複数の型をインスタンスとして持っている)

参考

プログラミングHaskell 第2版 – 技術書出版と販売のラムダノート

https://www.amazon.co.jp/dp/B009RO80XY