Dlaczego algorytm Hindleya-Milnera nigdy nie daje typu takiego jak t1 -> t2?

14

Czytam o algorytmie pisania Hindleya-Milnera podczas pisania implementacji i widzę, że tak długo, jak każda zmienna jest związana, zawsze otrzymasz albo typy atomowe, albo typy, w których argumenty określą typ końcowy, taki jak t1 -> t1lub (t1 -> t2) -> (t1 -> t2)gdzie t1i t2są zmiennymi typu.

Nie mogę wymyślić sposobu, w jaki można uzyskać coś takiego t1 -> t2lub po prostu t1, co rozumiem, że oznaczałoby to uszkodzenie algorytmu, ponieważ nie byłoby sposobu na określenie rzeczywistego rodzaju wyrażenia. Skąd wiesz, że nigdy nie dostaniesz takiego typu, jak te „zepsute”, o ile każda zmienna jest związana?

Wiem, że algorytm zwraca typy ze zmiennymi, ale zawsze są one rozwiązywane po przekazaniu argumentów do funkcji, czego nie byłoby w przypadku funkcji z typem t1 -> t2. Dlatego chcę wiedzieć, skąd wiemy, że algorytm nigdy nie da takich typów.

(Wygląda na to, że można uzyskać te „zepsute” typy w ML , ale pytam o rachunek lambda.)

Juan
źródło

Odpowiedzi:

16

α,β.αβα.ααλx.x

α,β.αββββββ

Δ=λx.xx(α.α)(α.α)ΔΔ

ZA,b,ZAbα,β.αβ

YY(λx.x)α.αZA,b,ZAb

Znalezienie cienkiej linii między systemami typów zapewniającymi silną normalizację a systemami typów, które nie są trudnym i interesującym problemem. Jest to ważny problem, ponieważ określa, która logika jest poprawna, innymi słowy, które programy zawierają dowody twierdzeń. Możesz pójść znacznie dalej niż System F, ale zasady stają się bardziej złożone. Na przykład rachunek konstrukcji indukcyjnych, który jest podstawą asystenta dowód Coq , silnie normalizuje się, ale jest w stanie opisać wspólne struktury danych indukcyjnych i algorytmy nad nimi, i więcej.

Gdy tylko dojdziesz do prawdziwych języków programowania, korespondencja się psuje. Prawdziwe języki programowania mają takie funkcje, jak ogólne funkcje rekurencyjne (które mogą się nie kończyć), wyjątki (wyrażenie, które zawsze wywołuje wyjątek, nigdy nie zwraca wartości, a zatem może mieć dowolny typ w większości systemów typów), typy rekurencyjne (które pozwalają na nieterminację zakraść się) itp.

Gilles „SO- przestań być zły”
źródło
„Jest to konsekwencja faktu, że System F silnie się normalizuje”. Jak można wykazać, że HM silnie się normalizuje, co jest konsekwencją silnej normalizacji Systemu F?
Rafael Castro
1
@RafaelCastro Każdy termin, który jest dobrze wpisany w HM, jest dobrze wpisany w Systemie F. Każdy dobrze wpisany termin w Systemie F to SN. Dlatego każdy termin, który jest dobrze wpisany w HM, to SN.
Gilles „SO- przestań być zły”