data宣言に型変数をつかう

データ構成子の引数は具体的な型じゃなくて型変数でもかまわない。

data Cream a b c = Eric a | Jack b | Ginger c deriving (Show)
*Main> [Eric 10, Ginger 'g', Jack 2.4]
[Eric 10,Ginger 'g',Jack 2.4]
*Main> [Eric 1.2, Ginger 3, Jack "2.4"]
[Eric 1.2,Ginger 3,Jack "2.4"]
*Main> [Eric 1.2, Ginger 3.1, Jack 2.4]
[Eric 1.2,Ginger 3.1,Jack 2.4]

引数にどんな型がきてもOK。
ただし,型変数は = の左側にも書いておなかなければいけない。↓の例では c が無いのでエラーになる。

data Cream a b = Eric a | Jack b | Ginger c deriving (Show)
*Main> :l datatype.hs
Compiling Main             ( datatype.hs, interpreted )

datatype.hs:1:42: Not in scope: type variable `c'
Failed, modules loaded: none.