Vaje#

Naloga 1#

Izpeljite in rešite enačbe za izpeljavo tipov naslednjih programov:

  1. |- (fun x -> x * x) 14

  2. f : α, v : bool |- if f v then 1 else 0

  3. 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.

Γ,f:αβ,x:αM:BEΓrecfx.M:αβα=A,β=B,EΓM1:A1EqΓM2:A2E2Γ(M1,M2):α1×α2α1=A1,α2=A2,E1,E2ΓM:AEΓfstM:α1α1×α2=A,EΓM:AEΓfstM:α2α1×α2=A,EΓM:A1EΓinlM:αα=A1+α2,EΓM:A2EΓinrM:αα=α1+A2,EΓM:AEΓ,x1:α1M1:B1E1Γ,x2:α2M2:B2E2ΓmatchMwithinlx1M1inrx2M2:ββ=B1,β=B2,α1+α2=A,E,E1,E2Γ[]:listαΓM1:A1E1ΓM2:A2E2ΓM1::M2:αα=listA1,α=A2,E1,E2ΓM:AE1ΓM1:A1E2Γ,x1:α1,x2:α2M2:A2E3ΓmatchMwith[]M1x1::x2M2:αα=A1,α=A2,A=listα1,A=α2,E1,E2,E3

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

ΓM1:A1E1ΓM2:listA2E2ΓM1::M2:αα=listA1,α=listA2,E1,E2

saj bi v primeru konstrukcije seznama 1 :: [] za tip [] dobili α, ki pa ni oblike listA in tipa ne bi mogli izpeljati.

Dodatna pravila za reševanje enačb so potrebna zato, da lahko razrešimo nove oblike tipov, ki smo jih uvedli.

A1=B1,A2=B2,EσA1×A2=B1×B2,EσA1=B1,A2=B2,EσA1+A2=B1+B2,EσA=B,EσlistA=listB,Eσ

Posodobiti pa moramo tudi funkcijo fv kot

fv(A1×A2)=fv(A1)fv(A2)fv(A1+A2)=fv(A1)fv(A2)fv(listA)=fv(A)

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.