[Haskell] generalised algebraic data types, existential types, and phantom types