Functional Programming with Bananas, Lenses, Envelopes and Barbed Wire
types , abstraction and parametric polymorphism .