型クラス(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."