class を作ってみる。

ジェネリックな関数を定義してみます。

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