Generics implementation options
Below is a decision matrix that can be used to evaluate which generics implementation is best.
There are many aspects to consider when we think about how to implement generics. For example, let's consider the difference between Haskell's parametric polymorphism and C++'s ad hoc polymorphism.
In Haskell, polymorphic functions are defined uniformly for all types. We could call this compile time polymorphism.
In C++, dynamic polymorphism, via substitution, virtual functions and interfaces enable polymorphic behavior, but whether our implementation works for any particular type is decided at runtime when the concrete type is substituted for its parameter.
C++ templates offer a similar functionality without the runtime overhead of dynamic polymorphism. The tradeoff is the fact that the flexibility is fixed at compile time.
Type classes in Haskell allow us to define different behaviors for the same function for different types. In C++, we do this using template specialization...