data宣言を使って,新しい型を宣言することができる。こんな感じだ。
data Cream = Eric | Jack | Ginger
data に続いて型のなまえ,= の右側には取りうる値を | で区切って列挙する。値は大文字で始まる必要があり,データ構成子(data constructor)という。上の例では,Cream 型は Eric,Jack,Ginger の3つの内のいずれかの値を取る,ということ。
*Main> :t Eric Eric :: Cream
値は他の型を引数に取ることができる。引数を取る/取らないは混ぜてもいい。
data Cream = Eric Int | Jack Int | Ginger
*Main> :t Eric 10 Eric 10 :: Cream
引数を取らないデータ構成子に引数を与えるとエラーになる。
<interactive>:1:0: Couldn't match `Cream' against `t -> t1' Expected type: Cream Inferred type: t -> t1 Probable cause: `Ginger' is applied to too many arguments in the call (Ginger 10)
逆に引数を取るデータ構成子に引数を与えないと
*Main> :t Jack Jack :: Int -> Cream
……えーと,これは関数と解釈していいのかな。
*Main> :t Jack (2*2) Jack (2*2) :: Cream
追記:
上の Jack は関数と考えて良さそうだ。
*Main> :t map Jack map Jack :: [Int] -> [Cream]