シリーズ「関数型言語haskellの深遠」 型クラス

今日のお題は「型クラス」。ややこしそうだが、理解できれば、応用範囲はすげー広い予感。
というわけで、(http://www.sampou.org/haskell/tutorial-j/classes.html)を読む。
以下は解説というより覚書なので、まちがっている可能性大です。ツッコミ歓迎。
断片的に集めた情報によると、haskellの型クラスは、Javaインターフェイスに対応していて、いわゆる関数シグニチャの集合としての型を定義できる。
定義例はこんな感じ。

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

Eqというクラスが定義されており、そのクラスが持つメソッド(操作)は==のみ。
そしてその==の型は、というと a->a->Boolになっている。つまり型aをふたつとってBoolを返す。いわゆる同値判定ですね。
で、もってこの定義で重要なのは、「以下に示す名前と型を持つような操作を持つ型aがすなわち、クラスEqに属する可能性がある」といっている、ということ。Javaインターフェイス定義と同じで、書いただけでは意味ない。Javaにおいても、インターフェイスを使うには、どこかでそれをimplementsした実体を作る必要がある。
じゃあimplementsってのはhaskellでどう書くの、っていうと、これがインスタンス宣言。こう書く。

instance Eq Integer where 
  x == y                =  x `integerEq` y

これで、「Integer型は、型クラスEqのインスタンスである」ということと、Integer型におけるメソッド(==)の実装定義が同時におこなわれる。
うーん。たとえば実装定義しないで、インスタンス宣言だけしたい、ってのは無しなんかな。


類なんてのが出てきた。。なんだこれ…
てか、型構築子とデータ構築子のあたり(http://www.sampou.org/haskell/tutorial-j/goodies.html)でおちこぼれているのだよなあ。
なんかサンプルを書いてみるしかないか。