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.