7.8 型クラス 中級講座
1. 序文
- 型クラスはインターフェースのようなものである。型クラスはどのような振る舞いを定義するか。例を3つあげよ。
- 型クラスの振る舞いは何を定義することで得られるか。
- Eqは、(3.1)が出来る値の型クラスである。Eqはどのような関数(メソッド)を定義しているか。(3.2)
- 標準ライブラリにおけるEqの定義を書け。
class Eq a where
と宣言して、クラスの中で(==) :: a -> a -> Bool
と型宣言する。関数の型は何か。
2. 交通信号データ型
- 値としてRed, Yellow, Greenをもつ交通信号の状態を定義する型TrafficLightを定義し、Eqのインスタンスを自動導出を用いずに作れ。
- クラスを宣言したときには、
==
を定義するのに/=
を使い、/=
の定義には==
を用いた。インスタンス宣言では、どちらか一方を上書きすれば良い。これは型クラスのなんと呼ばれる概念か。
- Showの最小完全定義を満たすように、型TrafficLightををShowのインスタンスにするコードを書け。このとき、例えば値
Red
なら"Red light"
と表示されるようにせよ。
3. サブクラス化
class (Eq a) => Num a where
と書かれたとき、Num
とEq
にはどのような関係があるか。
- 型クラス宣言に何をつけるとサブクラスを作ることが出来るか。
4. 多相型を型クラスのインスタンスに
- 型コンストラクタMaybeを型クラスEqのインスタンスとする例を1つ書け。
- 型クラスYourTypeClassのインスタンスの詳細を知るにはGHCiで何と入力すればよいか。
解答
1
- 等値性判定、順序の比較、列挙など
- 型クラス関数
- 1.等値性判定 2.==, /=
class Eq a where
(==) :: a -> a -> Bool
(/=) :: a -> a -> Bool
x == y = not (x /= y)
x /= y = not (x == y)
(Eq a) => a -> a -> Bool
2
data TrafficLight = Red | Yellow | Green
instance Eq TrafficLight where
Red == Red = True
Green == Green = True
Yellow == Yellow = True
_ == _ = False
- 型クラスの最小完全定義(minimal complete definition)
instance Show TrafficLight where
show Red = "Red light"
show Yellow = "Yellow light"
show Green = "Green light"
3
Num
はEq
のサブクラス
- 型クラス制約
4
instance (Eq m) => Eq (Maybe m) where
Just x == Just y = x == y
Nothing == Nothing = True
_ == _ = False
:info YourTypeClass
または、:i YourTypeClass