
On 7/18/11, Brandon Allbery
"Circumvents"? You make it sound like the point of typeclasses is to restrict things. In fact, the point is to *undo* the restrictions necessarily introduced by polymorphism: if you don't know the type of something, you don't know what you can do with it. Typeclasses let us say "this can be any type, but we need to be able to do <x> with it". They don't circumvent; they *add*.
I wish I could think of a good example. Since I can't, I'll just try and make my point: In a way, the point of typeclasses _is_ to restrict things: one of the things that typeclasses enables is a compile-time error if I, say, try and add Bools: by not giving Bool a Num instance, we're expressing that something can't be expressed. There has to be a reason why we've all typed "deriving (Eq)" again and again: because sometimes we don't want, for some OurType, to be able to express: (a :: OurType) == (b :: OurType). This is the source of my confusion. Thanks for your time, Tom