Haskellの型クラス
脱糖できる
定義する
code:hs
class Eq a where
(==) :: a -> a -> Bool
(/=) :: a -> a -> Bool
x == y = not (x /= y)
x /= y = not (x == y)
whereの後にmethodが続く
型クラスのインターフェース
Eq型クラスのインターフェースは==や/=
Eq型クラスのインスタンスとなる型の値なら↑これらが使える
たとえばIntとか
インターフェースのデフォルト実装
code:hs
class Eq a where
(==) :: a -> a -> Bool
(/=) :: a -> a -> Bool
x == y = not (x /= y)
x /= y = not (x == y)
Eq型クラスでは==と/=が定義されているが、これらは最小完全定義で定義されている つまり==の定義に/=を、/=の定義に==を使う相互再帰で定義されている
ので、インスタンスにするときも==か/=のどちらかについて定義しとけば両方使える
自作型を型クラスのインスタンスにする
信号を表す自作の型TLを型クラスEqのインスタンスにする
code:hs
-- 自作のTrafficLightの型
data TL = R | Y | G
-- Eq型クラスのインスタンスにする
instance Eq TL where
R == R = True
Y == Y = True
G == G = True
_ == _ = False
-- Show型クラスのインスタンスにする
instance Show TL where
show R = "Right Light"
show Y = "Yewllow Light"
show G = "Green Light"
既存の型を型クラスのインスタンスにする方法
instanceにする
サブクラスという概念
すごいH本.icon p.145
型クラスの例