「多相」というみたいです。オブジェクト指向言語では、あるオブジェクトに対するメソッド呼び出しが、そのオブジェクト(の種類、クラス)によって異なる振る舞いをする、という意味で使われます。Haskellにはパラメータ多相とアドホック多相があります。型チェックしますが、型が違うだけで実装が共通化できることがよくあります。いうとき、型をパラメータとします。次の例は、何かのリストの長さ(要素の数)を数えます。型変数で、どのような型でも受け付けます。C++のtemplateを使って次のように書けます。イテレータを引数に取ったほうがC++っぽいですが。前に、クラスについて解説しておきます。メジャーなオブジェクト指向言語のクラスとはずいぶん様子が違います。メジャーな、クラスベースのオブジェクト指向言語では、クラスは型です。型と言っても差し支えありません。クラスはオブジェクトのひな形であり、クラスをインスタンス化したものがオブジェクトです。クラスを継承して拡張することができます。クラス(型クラス)は型ではありません。それ自体ではオブジェクトを生成できないが、複数の型に共通するメソッドを括りだして定義できるようなものです。型が型クラスのインスタンスになります。抽象クラスが感覚として近いと思います。ことをアドホック多相と呼びます。型クラスが次のように定義されています。関数が定義されています。宣言するときに上書き(再定義)しないと、こちらの定義が使われます。y)CharはEqのインスタンスです。c'インスタンス宣言が型宣言の一部ではないないのが重要です。新たに定義したクラスで既存の型に対してインスタンス宣言を書くことができます。型クラスは、二つの効果があります。型クラス)サンプルを書いてみます。型クラスFooを定義します。hoge関数を持ちます。型IntがFooのインスタンスだと宣言します。既存の型でも構わないことに注目。関数をオーバーライドします。CharもFooのインスタンスとします。こちらは関数をオーバーライドしません。Fooでの定義が使われます。関数fの引数には、FooとShowのインスタンスを渡さなければならないことを示します。部分が制約を示します。実行結果は次のようになります。