Я вирішив надати мою мову Felix звичайними класами перевантаження та різнотипними типами.
Я вважаю (відкритим) перевантаження важливим, особливо мовою, яка є численним числовим типом (Фелікс має всі числові типи С). Однак на відміну від C ++, який зловживає перевантаженням, створюючи шаблони залежать від цього, поліморфізм Фелікса є параметричним: вам потрібна перевантаження шаблонів на C ++, оскільки шаблони в C ++ погано розроблені.
Класові типи також передбачені у Felix. Для тих, хто знає C ++, але не захоплюється Haskell, ігноруйте тих, хто описує це як перевантаження. Це не віддалено як перевантаження, скоріше, це як спеціалізація шаблонів: ви оголошуєте шаблон, який ви не реалізуєте, а потім надаєте реалізації для певних випадків, коли вони вам потрібні. Типізація є параметрично поліморфною, реалізація здійснюється за допомогою спеціальної інстанції, але вона не має бути обмеженою: вона повинна реалізувати передбачувану семантику.
У Haskell (і C ++) ви не можете вказати семантику. У C ++ ідея "Концепції" - це орієнтовно спроба апроксимації семантики. У Фелікс ви можете наблизити наміри до аксіом, скорочень, лем і теорем.
Основна, і єдина перевага (відкритої) перевантаження в такій принциповій мові, як Фелікс, полягає в тому, що це полегшує запам’ятовування імен функцій бібліотеки, як для програміста, так і для рецензента коду.
Основним недоліком перевантаження є складний алгоритм, необхідний для його здійснення. Він також не дуже добре відповідає висновкам типу: хоча ці два не зовсім ексклюзивні, алгоритм робити обидва досить складний, програміст, ймовірно, не зможе передбачити результати.
У C ++ це також проблема, оскільки він має неохайний алгоритм узгодження, а також підтримує автоматичні перетворення типів: у Felix I "виправлено" цю проблему, вимагаючи точної відповідності та автоматичних перетворень типу.
Тож у вас є вибір, на який я думаю: перевантаження або введення висновку. Висновок милий, але його також дуже важко реалізувати таким чином, щоб правильно діагностувати конфлікти. Наприклад, Ocaml повідомляє вам, де він виявляє конфлікт, але не звідки він вивів очікуваний тип.
Перевантаження не набагато краще, навіть якщо у вас є якісний компілятор, який намагається повідомити вам усіх кандидатів, важко буде прочитати, чи кандидати поліморфні, а ще гірше, якщо це хакерство шаблонів C ++.