プログラム内で用いるデータを表現するものです。参考データの宣言Haskellでは型をdata宣言を通じて導入、または宣言します。一般的にデータ宣言はこのように行います。[deriving]まだHaskellをあまり理解していいない方にはおそらく説明になっていないかもしれません。variableを与えることにあります。その後、多くのconstructorが続きます。constantのリストになっています。最後に付属的にderivingが続きます。他にも多くの微妙な事柄が必要です。データコンストラクタに必要なパラメータはeagerでなければならない、どんなclassがderivingの中で許可されているか、コンストラクタ内のfield名の使い方、contextが実際になにをするのかなどです。これらについてはそれぞれの記事を参照してください。いくつかの例を見てみましょう。Haskellの標準データ型Maybeは普通このように宣言されています。Nothingこれは、Maybe型はaで表される1つの型変数を持っていて、JustとNothingという2つのconstructorを持っているということを意味しています。Justコンストラクタは1つのパラメータ"a"をとります。Tree)を考えてみましょう。このように表されます。aここで、Treeのコンストラクタの1つBranchはコンストラクタのパラメータには2つのtreeを取る一方で、Leafは型変数"a"だけを取ります。Haskellではこういった再帰型は非常によく使われるpatternsです。他のHaskellプログラムに型を導入する方法はtypeとnewtypeを用いて行う方法です。typeはあるデータコンストラクタに対してシノニムを与えます。newtypeではある型をリネームして新しいコンストラクタを作成する必要があります。type宣言をするときは、型シノニムとその基底型はほぼいつでも交換可能です。(instance宣言を扱う場合にいくつか制限があります)たとえば、このような宣言があったとします。StringStringをシグネチャにもつどのような関数もName型の要素に対して用いることができます。String先ほどの例のようにはいきません。関数の宣言においては実際にFirstNameに対して定義されてなければいけません。このような要求を軽減するために、しばしばデコンストラクタを宣言します。sこれはよくnewtype内のfieldを使うときに行われます。(フィールドを幅広く使う人もいる一方で、多くの人がHaskellのフィールド実装は甘いと考えています。Haskellも参照してください)簡単な例たとえばトランプのゲームのブリッジを実装することを考えてみましょう。カードを表す何かが必要です。一つの例としてはこんなかんじです。スートと数を表すデータ型を作成します。StringやIntに変換できるようにderiving節を使っています。これによって同値性や順序を確認できます。型変数がないような型を使うことで、同値性はどのコンストラクタが使われたかに依存し、順序は記述の順番に依存します。ThreeはQueenよりも小さいです。実際にCardを定義してみましょう。Eq)この定義ではfieldを使っています。これによってCardの2箇所に対してアクセスする既成の関数が手に入ります。variables)が使われていませんが、データのconstructorは2つの引数に対して特定の型、つまりCardValueとSuitであることを要求しています。ここでのderiving節は単に求められている3つのClassを明記しているだけです。instance宣言をOrdやEnumに対して行います。comprehension)として表します。Spade]]追加してくださいより図解が多い例を歓迎します。参考データconstructorやclassに関する(必要な)記事を読んでみてください。reportやご自分が選んだ実装(GHC/Documentationなど)にも最新の情報があるかもしれません。HaskellWikiDisclaimers。