three chapters, already gone through this in Real World Haskell, but still worth reading