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ż system typów ML
Przypisy
Kategoria:Programowanie komputerów