Wszystkie mechanizmy polimorfizmu będą do siebie podobne. Jak się zastanowisz to klasy w haskellu są analogiczne do interfejsów z innych języków.
IMO type classy można uznać za uogólnienie interfejsów znanych z języków OOP. Interfejs pozwala na polimorfizm tylko dla klas i tylko dla argumentu "this", gdzie type klasy pozwalają na większą dowolność.
Fajnym przykładem jest typowa magia wymagana w językach używających zliczania referencji. Jeżeli chcemy mieć możliwość dobrania się do wskaźnika z poziomu typu niżej to wystarczy odpowiednio zmodyfikować sygnaturę:
struct Foo
impl Foo {
fn foo(self: Rc<Self>) {
do_something(self.clone());
}
}
co jest eleganckie, bo naszym this
może być też Rc<Self>
, a nie Self
.
W C++ ten problem rozwiązuje się dużo trudniej, musimy robić haksy z mixinami i dodatkowym trzymaniem stanu wewnątrz instancji:
struct Foo: std::enable_shared_from_this<Foo>
{
void foo () {
do_something(this->shared_from_this());
}
};
bo this musi mieć taki sam typ jak klasa