support type variabled constructors
more helpful errors
simplify pattern match
polymorphic data types