The family of example data types seems incomplete, because if you ever want to use Expr, you must provide an Expr, which means Expr is infinitely recursive. It is not possible to write down an Expr. I guess it is possible to create a generator which creates an infinite lazy structure, but is that what is intended by this "simple" example?