Hiding the extra tagging
The two-level approach introduces an extra layer of tagging in the
data structures. A set of auxiliary constructor functions is used to
hide this.
Old version
hsId n = Exp $ HsId n
hsLit lit = Exp $ HsLit lit
hsApp e1 e2 = Exp $ HsApp e1 e2
hsLambda pats e = Exp $ HsLambda pats e
...
(These functions are used in the parser, for example.)