LYH 7.8 型クラス 中級講座

7.8 型クラス 中級講座

1. 序文

  1. 型クラスはインターフェースのようなものである。型クラスはどのような振る舞いを定義するか。例を3つあげよ。
  2. 型クラスの振る舞いは何を定義することで得られるか。
  3. Eqは、(3.1)が出来る値の型クラスである。Eqはどのような関数(メソッド)を定義しているか。(3.2)
  4. 標準ライブラリにおけるEqの定義を書け。
  5. class Eq a whereと宣言して、クラスの中で(==) :: a -> a -> Boolと型宣言する。関数の型は何か。

2. 交通信号データ型

  1. 値としてRed, Yellow, Greenをもつ交通信号の状態を定義する型TrafficLightを定義し、Eqのインスタンスを自動導出を用いずに作れ。
  2. クラスを宣言したときには、==を定義するのに/=を使い、/=の定義には==を用いた。インスタンス宣言では、どちらか一方を上書きすれば良い。これは型クラスのなんと呼ばれる概念か。
  3. Showの最小完全定義を満たすように、型TrafficLightををShowのインスタンスにするコードを書け。このとき、例えば値Redなら"Red light"と表示されるようにせよ。

3. サブクラス化

  1. class (Eq a) => Num a whereと書かれたとき、NumEqにはどのような関係があるか。
  2. 型クラス宣言に何をつけるとサブクラスを作ることが出来るか。

4. 多相型を型クラスのインスタンス

  1. 型コンストラクタMaybeを型クラスEqのインスタンスとする例を1つ書け。
  2. 型クラスYourTypeClassのインスタンスの詳細を知るにはGHCiで何と入力すればよいか。

解答

1

  1. 等値性判定、順序の比較、列挙など
  2. 型クラス関数
  3. 1.等値性判定 2.==, /=
class Eq a where
    (==) :: a -> a -> Bool -- 型宣言
    (/=) :: a -> a -> Bool -- 型宣言
    x == y = not (x /= y) -- 相互再帰によるデフォルト実装
    x /= y = not (x == y) -- 相互再帰によるデフォルト実装
  1. (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
  1. 型クラスの最小完全定義(minimal complete definition)
instance Show TrafficLight where

    show Red = "Red light"
    show Yellow = "Yellow light"
    show Green = "Green light"

3

  1. NumEqのサブクラス
  2. 型クラス制約

4

instance (Eq m) => Eq (Maybe m) where
    Just x == Just y = x == y
    Nothing == Nothing = True
    _ == _ = False
  1. :info YourTypeClassまたは、:i YourTypeClass