Я решил предоставить обычные классы перегрузки и многотипных типов на своем языке Felix.
Я считаю (открытую) перегрузку необходимой, особенно в языке с большим количеством числовых типов (у Феликса есть все числовые типы Си). Однако в отличие от C ++, который злоупотребляет перегрузкой, заставляя шаблоны зависеть от этого, полиморфизм Феликса является параметрическим: вам нужно перегрузить шаблоны в C ++, потому что шаблоны в C ++ плохо спроектированы.
Классы типов также представлены в Феликсе. Для тех, кто знает C ++, но не использует Haskell, игнорируйте тех, кто описывает его как перегрузку. Это не удаленно, как перегрузка, скорее, это как специализация шаблона: вы объявляете шаблон, который не реализуете, а затем предоставляете реализации для конкретных случаев по мере необходимости. Типизация является параметрически полиморфной, реализация осуществляется посредством специальной реализации, но она не предназначена для ограничения: она должна реализовывать предполагаемую семантику.
В Haskell (и C ++) вы не можете указать семантику. В C ++ идея «Concepts» - это попытка приблизить семантику. В Феликсе вы можете аппроксимировать намерение с помощью аксиом, сокращений, лемм и теорем.
Основное и единственное преимущество (открытой) перегрузки в таком принципиальном языке, как Felix, заключается в том, что он облегчает запоминание имен библиотечных функций как для автора программы, так и для рецензента кода.
Основным недостатком перегрузки является сложный алгоритм, необходимый для его реализации. Он также не очень хорошо подходит для вывода типов: хотя оба эти метода не являются полностью исключительными, алгоритм выполнения обоих достаточно сложен, и программист, вероятно, не сможет предсказать результаты.
В C ++ это также проблема, поскольку он имеет неаккуратный алгоритм сопоставления и также поддерживает автоматическое преобразование типов: в Феликсе I «исправил» эту проблему, требуя точного сопоставления и не используя автоматических преобразований типов.
Так что у меня есть выбор: перегрузка или вывод типа. Вывод - это мило, но его также очень сложно реализовать таким образом, чтобы правильно диагностировать конфликты. Ocaml, например, сообщает вам, где он обнаруживает конфликт, а не откуда он вывел ожидаемый тип.
Перегрузка не намного лучше, даже если у вас есть качественный компилятор, который пытается сказать вам все кандидаты, может быть трудно прочитать, если кандидаты полиморфны, и еще хуже, если это хакерство шаблона C ++.