Haskellのclassによる型制約【Haskell class data】

classキーワード

型クラスの定義

Haskellでは等号、非等号を表すためにEqというクラスを使用しています。

class Eq a where
  (==), (/=) :: a -> a -> Bool

  x == y = not (x /= y)
  x /= y = not (x == y)

上記のEqクラスから以下の情報が読み取れます。

  • 等号が使用可能な型は、Eqを継承している
  • それぞれの型は、==/= メソッドが実装される。
  • ==/=は二つの同じ型を取り、最終的にBoolが返される。
  • デフォルトで、==/=が定義されているが、それぞれが依存関係にあるため、どちらかのメソッドは定義しなければならない

上記のEqクラスを使用して新しい型とそれに対する制約を作ります。

instance キーワード

それでは、Eqクラスを使用して新しい型Userを作ります。 型クラスUserが同一人物かどうかを判断するためにEqクラスを継承,インスタンス宣言します。

data User = User Int Name
instance Eq User where
    (User id username ) == (User id' username') = id == id` && username == username'

main do
    print( (User 10 "tanaka") == (User 20 "nakata") ) -- false
    print( (User 10 "tanaka") /= (User 20 "nakata") ) -- true
    print( (User 10 "tanaka") == (User 10 "tanaka") ) -- true