This will generate the instances Uniplate (Foo Int),
Biplate (Bool, Int) Int and Biplate (Foo Int) Int.
Generally, start with the instance you are after (e.g. UniplateDirect (Foo Int)),
try to compile and add further instances as necessary. UniplateDirect with
one argument derives Uniplate, and with two arguments derives Biplate.

deriving UniplateDirect on a data type with no arguments derives Uniplate
with all type parameters defaulting to ().