Typová inference ( angl. type inference ) - v programování schopnost kompilátoru logicky odvodit typ hodnoty samotného výrazu . Mechanismus odvození typu byl poprvé představen v jazyce ML , kde kompilátor vždy odvodí nejobecnější polymorfní typ pro jakýkoli výraz. To nejen snižuje velikost zdrojového kódu a zvyšuje jeho stručnost, ale často zvyšuje opětovné použití kódu [1] .
Typová inference je charakteristická pro funkcionální programovací jazyky , i když postupem času byla částečně implementována v objektově orientovaných jazycích ( C# , D , Visual Basic .NET , Nim , C++11 , Vala , Java [a] ), kde je omezena na možnost vynechat typ identifikátoru v definici s inicializací (viz syntaktický cukr ). Například:
var s = "Ahoj světe!" ; // Typ proměnné s (z řetězce) je odvozen od inicializátoruAlgoritmus Hindley-Milner je mechanismus odvození typu výrazu implementovaný v programovacích jazycích založených na systému typu Hindley-Milner , jako je ML (první jazyk této rodiny), Standard ML , OCaml , Haskell , F# , Fortress a Boo . Jazyk Nemerle používá tento algoritmus s řadou nezbytných úprav [2] .
Mechanismus odvození typu je založen na schopnosti automaticky odvodit, zcela nebo částečně, typ výrazu získaného vyhodnocením nějakého výrazu. Protože se tento proces systematicky provádí během překladu programu, kompilátor může často odvodit typ proměnné nebo funkce, aniž by explicitně specifikoval typy těchto objektů. V mnoha případech lze explicitní deklarace typu vynechat - to lze provést pro poměrně jednoduché objekty nebo pro jazyky s jednoduchou syntaxí. Například jazyk Haskell má poměrně výkonný mechanismus odvození typu, takže není nutné specifikovat typy funkcí v tomto programovacím jazyce. Programátor může specifikovat typ funkce explicitně, aby omezil její použití na konkrétní datové typy nebo pro strukturovanější formátování zdrojového kódu.
Aby překladatel získal informace pro správné vyvození typu výrazu v případě, že neexistuje explicitní deklarace typu tohoto výrazu, shromažďuje tyto informace buď z explicitních deklarací typů podvýrazů (proměnných, funkcí) obsažených. ve studovaném výrazu, nebo využívá implicitní informace o typech atomárních hodnot. Takovýto algoritmus ne vždy pomůže určit typ výrazu, zejména v případech použití funkcí vyšších řádů a parametrického polymorfismu poměrně složité povahy. Proto se ve složitých případech, kdy je potřeba vyhnout se nejasnostem, doporučuje výslovně specifikovat typ výrazů.
Samotný typizační model je založen na inferenčním algoritmu typu výrazu, jehož zdrojem je mechanismus odvození typu výrazu použitý v typovaném λ-kalkulu , který v roce 1958 navrhli H. Curry a R. Face. Dále Roger Hindley v roce 1969 rozšířil samotný algoritmus a dokázal, že odvozuje nejobecnější typ výrazu. V roce 1978 Robin Milner , nezávisle na R. Hindley, dokázal vlastnosti ekvivalentního algoritmu. A konečně v roce 1985 Louis Damas konečně ukázal , že Milnerův algoritmus je kompletní a může být použit pro polymorfní typy. V tomto ohledu je Hindley-Milnerův algoritmus někdy také nazýván Damas-Milnerův algoritmus .
Typový systém je definován v Hindley-Milnerově modelu takto:
Výrazy, jejichž typy se vyhodnocují, jsou definovány poměrně standardním způsobem:
O type se říká, že je instancí typu , když dojde k nějaké konverzi , která:
V tomto případě se obvykle předpokládá, že typové konverze podléhají omezením, kterými jsou:
Vlastní algoritmus typové inference se skládá ze dvou kroků - generování soustavy rovnic a následného řešení těchto rovnic.
Konstrukce soustavy rovnicKonstrukce soustavy rovnic je založena na následujících pravidlech:
V těchto pravidlech je symbolem soubor asociací mezi proměnnými a jejich typy:
Řešení soustavy rovnic
Řešení sestrojeného systému rovnic je založeno na sjednocovacím algoritmu . Toto je poměrně jednoduchý algoritmus. Existuje nějaká funkce , která bere rovnici typů jako vstup a vrací substituci, která dělá levou a pravou stranu rovnice stejnou ("sjednocuje" je). Substituce je jednoduše projekce typů proměnných na typy samotné. Takové substituce lze vypočítat různými způsoby, které závisí na konkrétní implementaci Hindley-Milnerova algoritmu.