Co to jest wnioskowanie typu?
Historycznie wnioskowanie typu (lub typu rekonstrukcji) oznacza, że wszystkie typów w programie może być uzyskane bez konieczności zasadniczo dowolnego wyraźny typu opisów. Jednak w ostatnich latach w głównym nurcie języka programowania stało się modne, aby oznaczyć nawet najbardziej banalne formy dedukcji typu "od dołu do dołu" jako "wnioskowanie typu" (np. Nowe deklaracje C++ 11). Więc ludzie zaczęli dodawać "pełne", aby odnieść się do "prawdziwej" rzeczy.
Co to jest pełna propozycja typu?
Istnieje szerokie spektrum tego, w jakim stopniu język może wnioskować o typach, aw praktyce prawie żaden język nie obsługuje "pełnego" typu wnioskowania typu w ścisłym tego słowa znaczeniu (rdzeń ML jest jedynym przykładem). Ale głównym czynnikiem wyróżniającym jest to, czy można uzyskać typy dla powiązań, które nie mają do nich "definicji", w szczególności parametrów funkcji. Jeśli możesz napisać, powiedzmy,
f(x) = x + 1
i system typów odczytuje, że np. ma typ Int → Int, wtedy sensowne jest wywoływanie tego typu wnioskowania. Ponadto, mówimy o polimorficzne typu wywnioskować kiedy, na przykład,
g(x) = x
przypisany jest ogólny typ i Forall; (t) t → t automatycznie.
Wnioskowanie o typ zostało wymyślone w kontekście prosto napisanego rachunku lambda, a wnioskowanie o typie polimorficznym (zwane również wnioskiem typu Hindley/Milner, wynalezione w latach 70. XX wieku) jest pretekstem do uznania rodziny języków ML (Standard ML , OCaml i prawdopodobnie Haskell).
Jakie są ograniczenia pełnego wnioskowania typu?
Core ML ma luksus "pełnego" polimorficznego typu wnioskowania. Ale zależy to od pewnych ograniczeń polimorfizmu w jego systemie typów. W szczególności tylko definicje mogą być ogólne, a nie argumenty funkcyjne. Oznacza to, że
id(x) = x;
id(5);
id(True)
działa dobrze, ponieważ id
można podać rodzaj polimorficzny gdy definicja jest znana. Ale
f(id) = (id(5); id(True))
nie typ kontroli w ML, ponieważ id
nie może być polimorficzny jako argument funkcji.Innymi słowy, system typów dopuszcza typy polimorficzne, jak i wszystkie, ale nie tak zwane wyższego rzędu typy polimorficzne, takie jak (i all (t) t → t) → Bool, gdzie stosuje się wartości polimorficzne w sposób pierwszorzędny (który, by to wyjaśnić, pozwala na to nawet bardzo niewiele języków jawnie wpisanych).
Polimorficzny współczynnik lambda (zwany również "Systemem F"), który jest jawnie wpisany, pozwala na to ostatnie. Ale jest to standardowy wynik w teorii typu, że rekonstrukcja typu dla pełnego Systemu F jest nierozstrzygalna. Hindley/Milner uderza słodką plamę o nieco mniej ekspresyjnym systemie typu, dla którego rekonstrukcja typu jest wciąż rozstrzygająca.
Istnieją bardziej zaawansowane funkcje systemowe, które powodują, że pełna rekonstrukcja typu jest nierozstrzygalna. Są też inne, które decydują o tym, ale wciąż są niewykonalne, np. obecność przeciążenia lub podporządkowania ad-hoc, ponieważ prowadzi to do kombinatorycznej eksplozji.
Python i Perl przyjść do głowy. Nie są to skompilowane języki, ale to nie ma znaczenia. Są sytuacje, w których wnioskowanie typu nie ma DWIM - z mojego doświadczenia Python jest nieco zbyt paranoiczny, a Perl nieco zbyt zrelaksowany. – tripleee
Python i perl są dynamicznie wpisywanymi językami programowania, typy są wiązane z wartościami/vars w * czasie wykonywania *, gdzie jak pytam o język, w którym typy są ustalane podczas kompilacji * statycznie wpisane, w pełni typowane * język – fedvasu
Czy próbowałeś czytać http://en.wikipedia.org/wiki/Type_inference? Co oznacza także wywnioskowanie w pełni typu? – Euphoric