Badanie wnioskowania na podstawie typu strony wywołującej?


9

Próbuję dowiedzieć się więcej na temat sprawdzania typu całego programu i systemów wnioskowania o typie, które wykorzystują informacje z witryn wywołań funkcji do obliczania informacji o typie (oprócz standardowego podejścia do używania treści funkcji). Na przykład taki algorytm może użyć wywołania funkcji, na przykład, foo(1)aby wnioskować, że funkcja w foopobiera argumenty liczb całkowitych. Oczywiście skomplikowałoby to wnioskowanie i sprawiłoby, że czek nie był modułowy.

W każdym razie nie miałem szczęścia znaleźć badań dotyczących tego podejścia, prawdopodobnie dlatego, że nie znam właściwej terminologii opisującej to, o czym mówię. Jakieś wskazówki?


To, co opisujesz, zawiera wskazówki wnioskowania dwukierunkowego, chyba że się mylę. Opisanie tego, co próbujesz zrobić, może jednak wyjaśnić.
— Dominic Mulligan

Pytasz, bo szukasz sposobu na specjalizację funkcji polimorficznych?
— nponeccop

W większości próbuję naprawdę dowiedzieć się więcej o systemach typów i tak, myślałem głównie o tym, jak obsługiwać funkcje polimorficzne (i wywoływanie metod w językach OO, to samo). Próbuję znaleźć odpowiednie warunki, aby móc o tym przeczytać.
— Derek Thurn

Odpowiedzi:


11

Prawie wszystkie systemy z wnioskowaniem typu wykorzystują do tego informacje z witryny wywołań. Przykłady obejmują Standard ML, OCaml, F # i Haskell. Wiele innych języków używa informacji o stronie wywoływania do wnioskowania o instancji parametru typu, takich jak Java, C #, Scala i Typed Racket. Często nazywa się to „Lokalne wnioskowanie typu”.

Po prostu opisałbym to, czego szukasz, jako „Wnioskowanie typu” i prawdopodobnie powinieneś zacząć od wyszukiwania tego, co jest powszechnie znane jako system „Hindley-Milner”. Strona Wikipedii zawiera rozsądne wprowadzenie i wskazówki do oryginalnych artykułów.

Miejscem do rozpoczęcia Lokalnego Wnioskowania jest oryginalny artykuł Pierce'a i Turnera, najlepiej przeczytać w wersji TOPLAS 2000 ( ACM , PDF ).


Dzięki artykułowi Pierce i Turner było bardzo pouczające. Czy zdajesz sobie sprawę z minimalnej implementacji algorytmu, który opisują w kodzie? Myślę, że byłoby to również bardzo interesujące, jeśli takowe istnieje.
— Derek Thurn

Nie znam żadnych minimalnych implementacji. Jeden jest w Typed Racket i jeden w Scali, ale oba implementują znacznie bardziej skomplikowane algorytmy.
— Sam Tobin-Hochstadt

0

Możesz rzucić okiem na systemy typów dla typów skrzyżowań, które mogą dać ci coś takiego a :: Int -> Int | Bool -> Bool, dzięki czemu wiesz, że dwie specjalizacje są wystarczające Inti Boolmożesz użyć wnioskowania typowego dla wnioskowania o najbardziej ogólnych typach, a następnie analizy przepływu sterowania w celu zebrania rzeczywistych wpisz argumenty. W rzeczywistości istnieją podejścia hybrydowe (CFA wyrażone jako system typów i odwrotnie).

Mogą istnieć badania nad wnioskowaniem najmniej ogólnych typów zamiast większości ogólnych typów, ale nie jestem ich świadomy.

Jeśli chodzi o techniki implementacji polimorfizmu, istnieją dwa rozwiązania: 1) specjalizacja (pomyśl o szablonach C ++) 2) założenie jednolitej reprezentacji (pomyśl o kolekcjach w stylu C z void *).

W przypadku 2 nie jest potrzebny typ ze strony wywoływania podczas sprawdzania typu, a łatwiej jest obsługiwać oddzielną kompilację.

Zauważ, że mówimy tutaj o polimorfizmie parametrycznym, a wirtualne wywołania metod OO to zupełnie inna rzecz zwana polimorfizmem podtypu. Zauważ, że szablony C ++ obsługują zarówno coś w rodzaju polimorfizmu parametrycznego, jak i pisanie na klawiaturze, co jest kolejną formą polimorfizmu.


1
„Wirtualne wywołania metod OO to zupełnie inna rzecz zwana polimorfizmem ad-hoc” Polimorfizm ad-hoc to kolejna nazwa przeciążenia. Wydaje się, że mylisz to z polimorfizmem podtypu.
— Radu GRIGore

Ale podklasy niekoniecznie są podtypami, prawda? Np. W przypadku podtypów LSP ma się utrzymać.
— nponeccop

1
To prawda, ale poza tym. „Polimorfizm podtypu” jest standardowym terminem. Szczegółowe informacje można znaleźć na stronie en.wikipedia.org/wiki/Subtype_polymorphism .
— Radu GRIGore
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.