Dlaczego języki programowania generują podpisy metod bez względu na typ zwracanego kodu?

11

Pracowałem z wieloma językami, które nie generują podpisu metody na podstawie typu zwrotu. Pracowałem również z jednym (może niektórym?), Który działa. Te, które nie sprawiały mi problemów w przeszłości (jak tutaj ). Dlaczego języki programowania generują podpisy metod bez względu na typ zwracanego kodu?

Aktualizacja: Mam na myśli szczególnie skompilowane języki o typie statycznym

Charles Lambert
źródło
To bardzo nieuzasadnione przypuszczenie, ale domyślam się, że ma to związek z trudnością implementacji kompilatora i / lub obsługi narzędzi.
Charles Lambert
W Haskell możesz używać klas, aby w zasadzie uzależnić funkcje zależne od typu zwracanego. I <3 Haskell: D: D: D
Thomas Eding

Odpowiedzi:

5

Nie pasowałby dobrze do hierarchii rzutowania i typów. Jeśli masz dwie wersje metody, z których jedna zwraca typ A, a druga zwraca typ B, masz problemy, gdy:

  • A lub B są wzajemnymi podtypami i przypisujesz wartość zwracaną do tego, który jest nadtypem.
  • A i B mają wspólny nadtyp, a ty przypisujesz taką wartość nadtypu.

Można to obejść za pomocą rzutów, ale wymagałoby to tyle samo pisania, co zmiana nazwy jednej z funkcji. Można również zarejestrować błąd kompilatora, gdy wywołanie jest niejednoznaczne, w którym to przypadku użytkownik musi poświęcić podobny wysiłek.

jprete
źródło
1
Pracowałem z językami, które zawierają typ zwrotu w podpisie. Przesyłanie w dowolne miejsce nie jest problemem, jak sugerujesz. W twoim konkretnym przykładzie nie musisz omijać tego z obsadami. Jeśli oba A i B (podtypy C) mają tę samą operację, należy je zadeklarować w C. Jeśli typ zwracany jest inny dla A niż dla B: W większości przypadków próbuje zwrócić podtyp C. dodaj inną metodę do podtypu, która zwraca podtyp i zaimplementuj wersję z C, aby wywołać tę z określonym podtypem. Teraz nie musisz rzucać wszędzie.
Charles Lambert
@Charles Lambert: To nie jest operacja na klasach A, B lub C. To dwie funkcje o tej samej nazwie i liście parametrów, jedna z nich zwraca coś typu A, a druga zwraca coś typu B. To pytanie dotyczy na więcej niż tylko systemy OOP, więc odpowiedziałem w oparciu o ogólne typy i funkcje. Nie rozumiem też, co zamierzają osiągnąć wasze obalone przykłady; potrzebuję więcej szczegółów, aby na nie odpowiedzieć.
jprete,
Komentarz jest za krótki na przykład. pastebin.com/JR39PKs0 w zasadzie języki, które zawierają typ zwrotu w podpisie, już znalazły sposoby na złagodzenie opisywanego problemu. Czy to konwencja kodowania, czy zwykła praktyka. Warto również zauważyć, że niewiele z tego, co piszesz, uzasadniałoby tworzenie metod, które różnią się jedynie rodzajem zwrotu. Więc znowu nie będziesz miał do czynienia z tym zbyt często
Charles Lambert
Czy istniałaby trudność z regułą, że dla każdej danej sygnatury argumentu można zadeklarować tylko jedną „podstawową” metodę, ale można zadeklarować dowolną liczbę metod wtórnych, a kompilator powinien wykonać przeciążenie, identyfikując najpierw sygnaturę argumentu, dla której istnieje podstawowa metoda, a następnie sprawdzanie metod wtórnych w określonej kolejności, aby sprawdzić, czy jakakolwiek taka metoda była jednoznacznie lepsza (lub czy byłaby użyteczna, nawet gdyby podstawowa nie była)?
supercat
3

Ponieważ możesz wywołać metodę i nie przypisywać jej wyniku.

Chiron
źródło
3
Nie w każdym języku.
Jörg W Mittag,
@Jorg Jakim językiem?
Chiron,
1
f # to jeden język. Często widzisz foo -> ignore, gdzie ignore jest metodą zwracającą jednostkę, która jest podobna do void
Charles Lambert
Ada jest lepszym przykładem. Ten język faktycznie używa również typów zwrotów jako części podpisu.
Charles Lambert
-4

Ogólna zasada: silnie pisane języki zazwyczaj wiążą podpis metody z typem zwracanym. Słabo wpisane języki nie.
Nie znam C #, ale zakładam, że problem może wynikać ze sposobu, w jaki C # obsługuje generyczne. Może to być zupełnie inna metoda dla ogólnej, w takim przypadku są to naprawdę dwie różne metody.

CMR
źródło
1
Jestem ciekawy, do którego z tych mocno pisanych języków odwołujesz się? Nie znam żadnego z nich i wiem, że C ++ wyraźnie zabrania rozwiązywania typu zwracanego.
greyfade
2
-1 Jeśli zamierzasz podać praktyczną regułę, która jest pozornie błędna, z jednym przykładem, który ją narusza, powinieneś podążać za nią wraz ze wszystkimi innymi przykładami, w których reguła jest przestrzegana.
@ Greyfade, miałem na myśli, że w słabo wpisanych językach przypisanie nie jest sprawdzane w czasie kompilacji. Zgadzam się, może to nie mieć znaczenia.
CMR
Twój punkt jest zaciemniony przez twoje niedokładne twierdzenie, że „silnie pisane języki zwykle wiążą ... z typem zwracanym”.
greyfade