Trying to simplify one major aspect, typeclasses try to collect the behavior independently of your class hierarchy.
Suppose you need to define a new numeric type MetaNum
(with standard numeric operations) but you can't or won't make it a subclass of your Complex
type, for whatever reason.
With Numeric
typeclass, you just need to provide an appropriate instance for your MetaNum
, providing the needed operations.
Then you can create a GenList[MetaNum]
and sum over it.
You can't do this with the NumList
, because MetaNum
is not a Complex
. The implementation choice you made when defining NumList
will stab back at you when you try to generalize your operation/data-structure in a second moment.
Conclusion
Typeclasses gives you more freedom to extend your behavior independently from hierarchical considerations, at the cost of some additional complexity and boilerplate.
I can't tell if you meant the same in your question.