ジェネリックな関数を定義してみます。
data Person = Japanese String | English String String sayHello :: Person -> String sayHello (English a b) = a++","++b++"!!" sayHello (Japanese a) = a++","++a++","++a ghci> sayHello (Japanese "hello") -- => "hello,hello,hello" ghci> sayHello (English "hello" "world") -- => "hello,world!!"
それと同じことをクラスを作ってやってみます。
data Japanese = Japanese String data English = English String String class Hello a where sayHello :: a -> String instance Hello Japanese where sayHello (Japanese a) = a++","++a++","++a instance Hello English where sayHello (English a b) = a++","++b++"!!" -- sayHello 関数の型は「Helloクラスのインスタンスを引数として -- 文字列を返す関数」。 ghci> :t sayHello sayHello :: (Hello a) => a -> String ghci> sayHello (Japanese "hello") -- => "hello,hello,hello" ghci> sayHello (English "hello" "world") -- => "hello,world!!"
比較するクラスを作ってみる。
class Eqq a where eqq :: a -> a -> Bool instance Eqq Japanese where eqq (Japanese a) (Japanese b) = a == b instance Eqq English where eqq (English a1 a2) (English b1 b2) = a1 == b1 && a2 == b2 > (Japanese "hello") `eqq` (Japanese "hello") -- => True > (Japanese "hello") `eqq` (Japanese "---") -- => False > (English "hello" "world") `eqq` (English "hello" "world") -- => True > (English "hello" "world") `eqq` (English "hello" "world!!") -- => False