Zdecydowałem się zapewnić zwykłe przeciążanie i klasy typów w moim języku Felix.
Uważam (otwarte) przeładowanie za niezbędne, szczególnie w języku, który jako wiele typów liczbowych (Felix ma wszystkie typy liczbowe C). Jednak w przeciwieństwie do C ++, który nadużywa przeciążania poprzez uzależnianie szablonów od niego, polimorfizm Felixa jest parametryczny: potrzebujesz przeciążenia szablonów w C ++, ponieważ szablony w C ++ są źle zaprojektowane.
Klasy typów są również dostępne w Felix. Dla tych, którzy znają C ++, ale nie grokują Haskella, zignoruj tych, którzy opisują to jako przeciążenie. Nie przypomina to przeciążania, jest raczej specjalizacją od szablonów: deklarujesz szablon, którego nie implementujesz, a następnie zapewniasz implementacje dla konkretnych przypadków, gdy są potrzebne. Wpisywanie jest parametrycznie polimorficzne, implementacja odbywa się przez tworzenie instancji ad hoc, ale nie ma być nieograniczona: musi implementować zamierzoną semantykę.
W Haskell (i C ++) nie można podać semantyki. W C ++ idea „Koncepcji” jest z grubsza próbą przybliżenia semantyki. W Felixie możesz przybliżać intencję za pomocą aksjomatów, redukcji, lematów i twierdzeń.
Główny i jedyny zaletą (otwartego) przeciążenia w dobrze funkcjonującym języku, takim jak Felix, jest to, że ułatwia zapamiętanie nazw funkcji bibliotecznych, zarówno dla twórcy programu, jak i dla recenzenta kodu.
Podstawową wadą przeciążenia jest złożony algorytm wymagany do jego wdrożenia. Nie jest też zbyt dobrze oparty na wnioskowaniu typu: chociaż oba nie są całkowicie wykluczające, algorytm do wykonania obu jest wystarczająco złożony, programista prawdopodobnie nie byłby w stanie przewidzieć wyników.
W C ++ jest to również problem, ponieważ ma on niepoprawny algorytm dopasowywania i obsługuje również automatyczne konwersje typów: w Felixie „naprawiłem” ten problem, wymagając dokładnego dopasowania i braku automatycznych konwersji typów.
Myślę, że masz wybór: przeciążenie lub wnioskowanie typu. Wnioskowanie jest urocze, ale bardzo trudne do wdrożenia w sposób, który prawidłowo diagnozuje konflikty. Na przykład Ocaml mówi ci, gdzie wykrywa konflikt, ale nie, skąd wywnioskował oczekiwany typ.
Przeładowanie nie jest dużo lepsze, nawet jeśli masz kompilator jakości, który próbuje powiedzieć ci wszystkich kandydatów, może być trudno odczytać, czy kandydaci są polimorficzni, a nawet gorzej, jeśli jest to hackery szablonów C ++.