data Expr = App Expr Expr | Lam (Expr -> Expr)
doesn’t really allow for free variables, which you often want—e.g. distinguishing locals, represented by variables in the metalanguage, from globals, represented as a constructor.
2. My Name datatype has a Gensym constructor so I can use Ints.