A deeper introduction to type classes