Ho scelto di fornire ordinarie classi di sovraccarico e multi-tipo nella mia lingua Felix.
Considero essenziale (aperto) il sovraccarico, specialmente in un linguaggio che come molti tipi numerici (Felix ha tutti i tipi numerici di C). Tuttavia, diversamente dal C ++ che abusa del sovraccarico facendo dipendere i modelli da esso, il polimorfismo di Felix è parametrico: è necessario un sovraccarico per i modelli in C ++ perché i modelli in C ++ sono mal progettati.
Le classi di tipi sono fornite anche in Felix. Per coloro che conoscono il C ++ ma non si lamentano di Haskell, ignorare quelli che lo descrivono come un sovraccarico. Non è un sovraccarico da remoto, piuttosto, è come una specializzazione di modello: dichiari un modello che non implementi, quindi fornisci implementazioni per casi particolari quando ne hai bisogno. La tipizzazione è parametricamente polimorfica, l'implementazione avviene per istanza ad hoc ma non è destinata a non essere vincolata: deve implementare la semantica prevista.
In Haskell (e C ++) non è possibile dichiarare la semantica. In C ++ l'idea "Concetti" è approssimativamente un tentativo di approssimazione della semantica. In Felix, puoi approssimare l'intenzione con assiomi, riduzioni, lemmi e teoremi.
Il vantaggio principale e unico del sovraccarico (aperto) in un linguaggio ben basato su principi come Felix è che semplifica la memorizzazione dei nomi delle funzioni della libreria, sia per chi scrive il programma che per chi esamina il codice.
Lo svantaggio principale del sovraccarico è il complesso algoritmo necessario per implementarlo. Inoltre, non si adatta molto bene all'inferenza di tipo: sebbene i due non siano del tutto esclusivi, l'algoritmo per fare entrambi è abbastanza complesso che il programmatore probabilmente non sarebbe in grado di prevedere i risultati.
In C ++ questo è anche un problema perché ha un algoritmo di adattamento sciatto e supporta anche conversioni di tipo automatiche: in Felix I ho "risolto" questo problema richiedendo una corrispondenza esatta e nessuna conversione di tipo automatica.
Quindi hai una scelta, penso: sovraccarico o inferenza del tipo. L'inferenza è carina, ma è anche molto difficile da implementare in un modo che diagnostica correttamente i conflitti. Ocaml, ad esempio, ti dice da dove rileva un conflitto, ma non da dove ha dedotto il tipo previsto.
Il sovraccarico non è molto meglio, anche se hai un compilatore di qualità che cerca di dirti tutti i candidati, può essere difficile leggere se i candidati sono polimorfici, e ancora peggio se si tratta di un hacker di template C ++.