Eu escolhi fornecer sobrecarga comum e classes de tipo multi-tipo no meu idioma Felix.
Considero a sobrecarga (aberta) essencial, especialmente em um idioma que possui muitos tipos numéricos (Felix possui todos os tipos numéricos de C). No entanto, diferentemente do C ++, que abusa da sobrecarga ao fazer com que os modelos dependam dele, o polimorfismo Felix é paramétrico: você precisa sobrecarregar os modelos em C ++ porque os modelos em C ++ são mal projetados.
As classes de tipo também são fornecidas no Felix. Para aqueles que conhecem C ++, mas não criticam Haskell, ignore aqueles que o descrevem como sobrecarga. Não é remotamente como sobrecarregar, é como especialização de modelo: você declara um modelo que não implementa e fornece implementações para casos específicos, conforme necessário. A digitação é parametricamente polimórfica, a implementação é por instanciação ad hoc, mas não se destina a ser irrestrita: ela precisa implementar a semântica pretendida.
No Haskell (e C ++), você não pode declarar a semântica. Em C ++, a idéia "Conceitos" é aproximadamente uma tentativa de aproximar a semântica. Em Felix, você pode aproximar a intenção com axiomas, reduções, lemas e teoremas.
A principal e única vantagem da sobrecarga (aberta) em uma linguagem bem baseada em princípios como o Felix é que facilita a lembrança dos nomes das funções da biblioteca, tanto para o criador do programa quanto para o revisor de código.
A principal desvantagem da sobrecarga é o algoritmo complexo necessário para implementá-lo. Também não se encaixa muito bem com a inferência de tipo: embora os dois não sejam totalmente exclusivos, o algoritmo para fazer as duas coisas é complexo o suficiente, o programador provavelmente não seria capaz de prever os resultados.
Em C ++, isso também é um problema, pois possui um algoritmo de correspondência desleixada e também suporta conversões de tipo automáticas: no Felix, eu "consertei" esse problema exigindo uma correspondência exata e nenhuma conversão de tipos automática.
Então você tem uma escolha: sobrecarregar ou digitar inferência. A inferência é atraente, mas também é muito difícil de implementar de uma maneira que diagnostica adequadamente os conflitos. Ocaml, por exemplo, informa onde detecta um conflito, mas não de onde inferiu o tipo esperado.
A sobrecarga não é muito melhor, mesmo se você tiver um compilador de qualidade que tente informar todos os candidatos, pode ser difícil ler se os candidatos são polimórficos e, pior ainda, se for hackeamento de modelo C ++.