Vaje#
Naloga 1#
Izpeljite in rešite enačbe za izpeljavo tipov naslednjih programov:
|- (fun x -> x * x) 14
f : α, v : bool |- if f v then 1 else 0
g : bool -> α |- (fun f -> f (g true)) (fun x -> x + 2)
Preverite, ali vrstni red enačb vpliva na rezultat. Ugotovite kje se pojavi problem pri določanju tipa funkcije fun f -> f f
.
Naloga 2#
Algoritem za izpeljavo tipov dopolnite za: rekurzijo, pare, vsote in sezname.
Kot pri dodajanju novih pravil za tipe moramo za vsak nov sintaktični konstrukt dodati pravilo za izpeljavo tipa in dodatne enačbe. Glede na dodajanje novih enačb moramo tudi posodobiti pravila za reševanje sistema enačb.
Možnosti za dodajanje pravil je več, pri nekaterih lahko že nekoliko rešimo enačbe, lahko pa sestavimo bolj splošna pravila in reševanje enačb prepustimo algoritmu za reševanje. Vseeno pa je treba biti pozoren, napačno pravilo za konstrukcijo seznama bi namreč bilo
saj bi v primeru konstrukcije seznama 1 :: []
za tip []
dobili
Dodatna pravila za reševanje enačb so potrebna zato, da lahko razrešimo nove oblike tipov, ki smo jih uvedli.
Posodobiti pa moramo tudi funkcijo
Z dodajanjem novih oblik tipov je vedno več enačb “nerešljivih”, saj nimajo ujemajočih oblik.
Naloga 3#
Izpeljite tip funkcije map
. Napišite še kakšen program, ki uporablja konstrukte iz naloge 2 in mu določite tip.