fugafuga.write

日々のログ

すごいH本 part42

インスタンスの自動導出

  • 型クラスはある振る舞いを定義するインターフェースである
  • Haskell ではまずデータ型をつくり、それがどう振る舞えるかを考える
    • 仮にその型が等値制をテストできるなら Eq型クラスのインスタンスにする
    • 仮にその型が大小比較できるものなら Ord型クラスのインスタンスにする
  • Haskell には特定の型クラスのインスタンス宣言を自動導出(derive)する機能がある
    • 自動導出できる型クラスは以下の6つ
      • Eq
      • Ord
      • Enum
      • Bounded
      • Show
      • Read
    • 自動導出にはderivingキーワードを使う

実際に見てみる

以下のような人間を表現するデータ型があったとする

data Person = Person { firstName :: String
                     , lastName :: String
                     , age :: Int
                     }

人間を同一人物かどうか判定することは妥当なのでEq型クラスを自動導出する。

data Person = Person { firstName :: String
                     , lastName :: String
                     , age :: Int
                     } deriving (Eq)

この時、すべてのフィールドの型が Eq型クラスのインスタンスでないとダメ。なぜなら全てのフィールドを比較する必要があるから。

mikeD = Person {firstName = "Michael", lastName = "Diamond", age = 43}
adRock = Person {firstName = "Adam", lastName = "Horovits", age = 41}
mca = Person {firstName = "Adam", lastName = "Yauch", age = 44}

Eqインスタンスを試す

*Main> mca == adRock
False
*Main> mikeD == adRock
False
*Main> mikeD == mikeD
True

Eq a という型クラス制約のついた関数なら Person が使える

*Main> let beastieBoys = [mca, adRock, mikeD]
*Main> mikeD `elem` beastieBoys
True

所感

用語がごっちゃになってきているので整理する必要がある。型クラス、型コンストラクタ、型変数、インスタンスあたり。教えてもらったとおりに頭を真っ白にしてインプットしたほうが良さそう。

[asin:B009RO80XY:detail]