インスタンスの自動導出
- 型クラスはある振る舞いを定義するインターフェースである
- Haskell ではまずデータ型をつくり、それがどう振る舞えるかを考える
- 仮にその型が等値制をテストできるなら
Eq型クラス
のインスタンスにする - 仮にその型が大小比較できるものなら
Ord型クラス
のインスタンスにする
- 仮にその型が等値制をテストできるなら
- Haskell には特定の型クラスのインスタンス宣言を自動導出(derive)する機能がある
- 自動導出できる型クラスは以下の6つ
- Eq
- Ord
- Enum
- Bounded
- Show
- Read
- 自動導出には
deriving
キーワードを使う
- 自動導出できる型クラスは以下の6つ
実際に見てみる
以下のような人間を表現するデータ型があったとする
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
所感
用語がごっちゃになってきているので整理する必要がある。型クラス、型コンストラクタ、型変数、インスタンスあたり。教えてもらったとおりに頭を真っ白にしてインプットしたほうが良さそう。