This chapter details it:

http://book.realworldhaskell.org/read/defining-types-streamlining-functions.html

More questions are welcome, of course.