GADTs

GADTs or Generalized Algebraic Data Types have already been explained elsewhere: