Ho scelto di fornire normali classi di tipi di overload e multi-type nella mia lingua Felix.
Considero essenziale il sovraccarico (aperto), specialmente in un linguaggio che ha molti tipi numerici (Felix ha tutti i tipi numerici di C). Tuttavia a differenza del C ++ che abusa del sovraccarico facendo dipendere da esso i template, il polimorfismo di Felix è parametrico: è necessario un sovraccarico per i template in C ++ perché i template in C ++ sono mal progettati.
Anche le classi di tipi sono fornite in Felix. Per quelli che conoscono il C ++ ma non fanno il grok Haskell, ignorano quelli che lo descrivono come un sovraccarico. Non è da remoto come un sovraccarico, piuttosto è come la specializzazione del modello: dichiarate un modello che non implementate, quindi fornite le implementazioni per casi particolari come ne avete bisogno. La tipizzazione è parametrica- mente polimorfica, l'implementazione avviene mediante istanze ad hoc ma non è intesa come non vincolata: deve implementare la semantica prevista.
In Haskell (e C ++) non puoi dichiarare la semantica. In C ++ l'idea di "Concetti" è approssimativamente un tentativo di approssimare la semantica. In Felix, puoi approssimare l'intenzione con assiomi, riduzioni, lemmi e teoremi.
Il vantaggio principale, e solo dell'overloading (aperto) in un linguaggio ben definito come Felix è che rende più facile ricordare i nomi delle funzioni della libreria, sia per il programma che per il programma di revisione del codice .
Lo svantaggio principale del sovraccarico è il complesso algoritmo richiesto 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 corrispondenza sciatta e supporta anche conversioni di tipo automatiche: in Felix I "risolto" questo problema richiedendo una corrispondenza esatta e nessuna conversione di tipo automatico.
Quindi hai una scelta che penso: sovraccarico o inferenza del tipo. L'inferenza è carina, ma è anche molto difficile da implementare in modo da diagnosticare correttamente i conflitti. Ocaml, ad esempio, ti dice dove rileva un conflitto, ma non da dove ha inferito il tipo atteso.
Il sovraccarico non è molto migliore, anche se hai un compilatore di qualità che cerca di dirti tutti i candidati, può essere difficile leggere se i candidati sono polimorfici, e ancor peggio se è un hackery del modello C ++.