Elegí proporcionar sobrecarga ordinaria y clases de tipos de tipos múltiples en mi idioma Felix.
Considero que la sobrecarga (abierta) es esencial, especialmente en un lenguaje que tiene muchos tipos numéricos (Felix tiene todos los tipos numéricos de C). Sin embargo, a diferencia de C ++, que abusa de la sobrecarga al hacer que las plantillas dependan de él, el polimorfismo de Felix es paramétrico: es necesario sobrecargar las plantillas en C ++ porque las plantillas en C ++ están mal diseñadas.
Las clases de tipo también se proporcionan en Felix. Para aquellos que conocen C ++ pero no dominan a Haskell, ignoren a aquellos que lo describen como sobrecargado. No es remotamente como una sobrecarga, más bien, es como una especialización de plantilla: declara una plantilla que no implementa, luego proporciona implementaciones para casos particulares cuando los necesita. La tipificación es polimórfica paramétricamente, la implementación es por instanciación ad hoc pero no está destinada a ser sin restricciones: tiene que implementar la semántica prevista.
En Haskell (y C ++) no se puede establecer la semántica. En C ++, la idea de "Conceptos" es más o menos un intento de aproximar la semántica. En Félix, puede aproximar la intención con axiomas, reducciones, lemas y teoremas.
La principal y única ventaja de la sobrecarga (abierta) en un lenguaje bien basado en principios como Felix es que hace que sea más fácil recordar los nombres de las funciones de la biblioteca, tanto para el escritor del programa como para el revisor del código.
La principal desventaja de la sobrecarga es el complejo algoritmo requerido para implementarlo. Tampoco se adapta muy bien a la inferencia de tipos: aunque los dos no son completamente exclusivos, el algoritmo para hacer ambos es lo suficientemente complejo como para que el programador probablemente no pueda predecir los resultados.
En C ++, esto también es un problema porque tiene un algoritmo de coincidencia descuidado y también admite conversiones de tipo automáticas: en Félix "solucioné" este problema al requerir una coincidencia exacta y no conversiones de tipo automáticas.
Entonces, creo que tiene una opción: sobrecarga o inferencia de tipos. La inferencia es linda, pero también es muy difícil de implementar de manera que diagnostique conflictos adecuadamente. Ocaml, por ejemplo, le dice dónde detecta un conflicto, pero no de dónde dedujo el tipo esperado.
La sobrecarga no es mucho mejor, incluso si tiene un compilador de calidad que intenta decirle a todos los candidatos, puede ser difícil de leer si los candidatos son polimórficos, y aún peor si se trata de piratería de plantillas C ++.