a package:simple-reflect

This data type specifies the associativity of operators: left, right or none.
A variable with the given name
Single letter variable names. All names have type Expr, except for f, g and h, which are generic functions. This means that show (f x :: Expr) == "f x", but that show (a x :: Expr) gives a type error. On the other hand, the type of g in show (f g) is ambiguous.