When the GADTs extension is enabled, besides regular data declarations, you can also declare generalized algebraic datatypes as follows:
data DataType a where
Constr1 :: Int -> a -> Foo a -> DataType a
Constr2 :: Show a => a -> DataType a
Constr3 :: DataType Int
A G...