型クラスは異なるデータ型に共通する操作を定義する。

型クラス(type class)は異なるデータ型に共通する操作を定義する。


class SayHello a where
sayHello :: a -> String

その1 Person 型


data Person = Person { name :: String, msg :: String}
deriving (Eq, Ord, Show)

Person 型の SayHello インスタンス


instance SayHello Person where
sayHello (Person name msg ) = "name:"++ name ++" " ++ msg

その2 Employee 型


data Employee = Employee { person:: Person, code :: Int }
deriving (Eq, Ord, Show)

Employee 型の SayHello インスタンス


instance SayHello Employee where
sayHello (Employee (Person name msg) code) = "name:"++ name ++
" code:" ++ show code ++ " " ++msg

p = Person {name = "hoge", msg="Helloooooooooooooooo !"}

e = Employee { person = Person {name="taro",msg = "Good moooooooooornig."}, code= 12124 }

どちらの SayHello インスタンスも区別を意識することなく呼べる。


*Main> :load class.hs
[1 of 1] Compiling Main ( class.hs, interpreted )
Ok, modules loaded: Main.
*Main> sayHello p
"name:hoge Helloooooooooooooooo !"
*Main> sayHello e
"name:taro code:12124 Good moooooooooornig."