Algebraic And Coalgebraic Methods In The Mathematics Of Program Construction by Jeremy Gibbons & Roland Backhouse