Functional Programming And Input / Output by Andrew D. Gordon