fugafuga.write

日々のログ



すごいH本 part50

祝 part 50

型クラスのサブクラス化

Num クラスの型宣言

class (Eq a) => Num a where
...

Num 型クラスのインスタンスは Eq 型クラスのインスタンスである必要がある。

サブクラス作成に必要な知識はこれだけ。

多相型を型クラスのインスタンスにする

型コンストラクタを持つ Maybe など。

instance Eq (Maybe Int) where
...
instance Eq (Maybe Char) where
...

などと定義していたらキリがない。

なので多相型は型引数を変数として残すことが許可されている。

instance Eq (Maybe m) where
    Just x == Just y = x == y
    Nothing == Nothing = True
    _ == _ = False

Maybe m とすることで具体型として宣言する。 Maybe something のような格好をしている型はまとめてEqのインスタンスにしたい、を表現している。

しかし、Maybe の中身に対して == を使用していることが問題となってくる。 型 m はEq型クラスのインスタンスである保証はどこにもない。 そこで、型制約の出番となる。

instance (Eq m) => Eq (Maybe m) where
    Just x == Just y = x == y
    Nothing == Nothing = True
    _ == _ = False

こうすることで、型 m は Eq 型クラスのインスタンスでなければならないという制約が課される。 これは自動導出がやっていることと同じ。

  • 型クラス宣言で型クラス制約を使うのは、ある型クラスを別の型クラスのサブクラスにする場合。
  • インスタンス宣言で型クラス制約を使うのは、型の中身に対する必要条件を記述する場合。

ghci で:info TypeClass とすると、型の情報が見れる。TypeClass は 型クラス、型、型コンストラクタに使える。

:i でもいける。

*Main> :info Maybe
data Maybe a = Nothing | Just a         -- Defined in ‘GHC.Base’
instance Eq a => Eq (Maybe a) -- Defined in ‘GHC.Base’
instance Monad Maybe -- Defined in ‘GHC.Base’
instance Functor Maybe -- Defined in ‘GHC.Base’
instance Ord a => Ord (Maybe a) -- Defined in ‘GHC.Base’
instance Read a => Read (Maybe a) -- Defined in ‘GHC.Read’
instance Show a => Show (Maybe a) -- Defined in ‘GHC.Show’
instance Applicative Maybe -- Defined in ‘GHC.Base’
instance Foldable Maybe -- Defined in ‘Data.Foldable’
instance Traversable Maybe -- Defined in ‘Data.Traversable’
instance Monoid a => Monoid (Maybe a) -- Defined in ‘GHC.Base’

*Main> :i Char
data Char
  = ghc-prim-0.5.0.0:GHC.Types.C# ghc-prim-0.5.0.0:GHC.Prim.Char#
        -- Defined in ‘ghc-prim-0.5.0.0:GHC.Types’
instance Bounded Char -- Defined in ‘GHC.Enum’
instance Enum Char -- Defined in ‘GHC.Enum’
instance Eq Char -- Defined in ‘ghc-prim-0.5.0.0:GHC.Classes’
instance Ord Char -- Defined in ‘ghc-prim-0.5.0.0:GHC.Classes’
instance Read Char -- Defined in ‘GHC.Read’
instance Show Char -- Defined in ‘GHC.Show’

所感

型クラスとそのインスタンスについて理解が進んだ。型の世界が広い。

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!

  • 作者: MiranLipovaca
  • 出版社/メーカー: オーム社
  • 発売日: 2017/07/14
  • メディア: Kindle版
  • 購入: 4人 クリック: 9回
  • この商品を含むブログを見る