Haskellの型クラス
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"
既存の型を型クラスのインスタンスにする方法
Haskellのderivingを使う
instanceにする
サブクラスという概念
すごいH本.icon p.145
型クラスの例
Eq型クラス
Ord型クラス
Show型クラス
Read型クラス
Enum型クラス
Bounded型クラス
Num型クラス
Fractional型クラス
Floating型クラス
Integral型クラス
Semigroup型クラス
Pointed型クラス
Functor型クラス
Applicative型クラス
Alternative型クラス
Monad型クラス
Monoid型クラス
Traversable型クラス