...
And you can pattern match on these constructors for different types in one
function:
eval :: Expr a -> a
eval (Plain x) = x
eval (Add e1 e2) = eval e1 + eval e2
eval (If eb t f) = if eval eb then eval t else eval f
eval (And e1 e2) = eval e1 && eval e2
...