type classes and generality