Functional Programming with Bananas, Lenses, Envelopes and Barbed Wire