Inferencja typów – Wikipedia, wolna encyklopedia

Inferencja typów – mechanizm w językach statycznie typowanych, w którym kompilator określa typ danych na podstawie informacji dostępnych w czasie kompilacji, np. typów zadeklarowanych wcześniej lub określania typów na podstawie wartości już znanych zmiennych[1]. Przykładem języka programowania, który wykorzystuje inferencję typów jest TypeScript.

Przykład

[edytuj | edytuj kod]

Dla przykładu w wyjątkowo niezłożonym języku, kod został już przetworzony w drzewo składniowe z jednoargumentowymi (rozwiniętymi) funkcjami (przykładowy kod w Ocamlu).

Nasz język ma tylko dwie konstrukcje – atomy i aplikacje funkcji. Podobnie typy dzielą się na atomowe i funkcyjne:

type utype = Basic of string | Fun of utype * utype;;  type expr = Atom of utype | Fapp of expr * expr;; 

Kompilator musi sprawdzić trzy wyrażenia: (+), (+ 2) i ((+ 2) 2), oblicza więc typy atomów: (int->int->int), ((int->int->int) int), (((int->int->int) int) int) i podaje je do naszego inferatora:

let plus = Atom (Fun (Basic "int", Fun (Basic "int", Basic "int")));; let two_plus = Fapp (plus, Atom (Basic "int"));;   let two_plus_two = Fapp (two_plus, Atom (Basic "int"));; 

Procedura inferencji jest prosta: wylicza się typ ciała funkcji oraz jej argumentu, po czym jeśli:

  • typ funkcja nie jest funkcyjny - oznacza to błąd "not a function"
  • funkcja jest typu funkcyjnego, ale typ jej argumentu nie zgadza się z typem podanego argumentu - oznacza to błąd "argument type mismatch"
  • jeśli funkcja jest typu funkcyjnego i typy argumentów się zgadzają wyrażenie ma wartość taką jaką zwraca funkcja

Przy czym w językach polimorficznych nie sprawdza się równości tylko unifikuje typy argumentu spodziewanego i rzeczywistego.

let rec utype_infere = function     Atom a -> a   | Fapp (f,arg) ->       let f_type = utype_infere f       in let arg_type = utype_infere arg       in match (f_type,arg_type) with           (Basic _,_) -> failwith "not a function"         | (Fun(fat,rt),aat) ->             if fat = aat             then rt             else failwith "argument type mismatch" ;; 

I podanie wyrażeń do inferatora:

utype_infere plus;; utype_infere two_plus;; utype_infere two_plus_two;; 

W rzeczywistych językach należałoby też zająć się inferencją typów funkcji, krotek, pętli, konstrukcji warunkowych i innych zwykle spotykanych konstrukcji. Większość z nich można przedstawić jako funkcje polimorficzne.

Zobacz też

[edytuj | edytuj kod]

Przypisy

[edytuj | edytuj kod]

Bibliografia

[edytuj | edytuj kod]