This syntax is used to declare GADT without GADT-syntax.
For instance,
data Z a b = (a ~ Int, b ~ Bool) => Z1 a b
| (Show a, b ~ Float) => Z2 a b
is equivalent to
data Z a b where
Z1 :: Int -> Bool -> Z Int Bool
Z2 :: Show a => a -> Float -> Z a Float