p3 Flashcards
Šta je specifično pri aplikaciji lambda?
Ukoliko apliciramo lambda, ona mora biti u zagradi ukoliko je u pitanju samo lambda, zbog pravila prioriteta. Međutim, ukoliko je ta lambda vezana za neki simbol tokom pattern matchinga, u tom slučaju zagrade nisu potrebne, ukoliko se aplikacija vrši tim simbolom.
Kada se dešava pattern matching?
Tokom runtime-a.
Koji je ekvivalentan izraz sljedećem let izrazu: let imefje = (fun pat -> expr1) in expr2
let imefje pat = expr1 in expr2. Pri čemu, ukoliko pišemo in, let izgleda kao prethodno navedeno, a ako ga izostavimo, expr2 se prenosi u naredni red. Prethodni zapis je samo sintaktički šećer koji kompajler transformiše u oblik iz pitanja.
Kako se formiraju jezički blokovi u F# programskom jeziku?
Jezički blokovi u F# programskom jeziku se formiraju na osnovu pravila indentiranja koda. Sve što čini neki blok mora se pojaviti u novom redu indentirano u odnosu na izraz. Ako je u pitanju let izraz, sve što se nalazi indentirano ispod let izraza se nalazi esencijalno unutar tog let izraza, sve do zadnjeg izraza koji nije indentiran, a on predstavlja kraj let bloka
Kojeg je tipa lambda
Lambda izraz je vrijednost tipa lambda. To nije monomorfan tip, već zajedničko ime za familiju tipova. Tip lambda je označen strelicom. Ako vidimo strelicu, to nam označava da je u pitanju funkcija ili tip lambda. Ime tog tipa je zapravo T1 -> T2. T1 je tip vrijednosti koja se prosljeđuje pri aplikaciji lambda, a T2 je tip vrijednosti koju vraća lambda.
Kako kompajler radi type inference?
Kompajler radi type inference na osnovu Henry–Milner type inference teorije
Šta sve ima tip?
Svako ime, odnosno simbol, koji figurira unutar uzorka i koji se podudaranjem veže za neku vrijednost, ima tip koji treba da odgovara tipu vrijednosti. Zato što podudaranje nema smisla ukoliko tip vrijednosti ne odgovara tipu simbola koji figurira u uzorku.
Kako kompajler zaključuje tip na osnovu Henry-Milner teoreme?
Kompajler sam zaključuje tip na osnovu konteksta upotrebe uzorka i tipa vrijednosti
Kakav tip mora biti unutar jednog izraza?
Tip mora biti jednoznačan, obzirom da u F# programskom jeziku ne postoji implicitna konverzija.
Kako se eksplicitno anotira tip nekog simbola?
ime_simbola : tip.
Ukoliko tip vrijednosti i tip anotacije nekog simbola nisu isti, šta će se desiti?
Doći će do greške u kompiliranju. Neće doći do iznimke, već error
Navesti oblik potpune anotacije za let izraz koji jeste i koji nije Sugar syntax.
Za Sugar syntax: let fja (x : tip1) : tip2 = expr1 in expr2. Za non Sugar syntax: let fja : tip1 -> tip2 = (fun x -> expr) in expr2.
Šta se desi kada kompajler zaključi tip?
Kompajler zaključi tip na osnovu prve aplikacije, ukoliko postoji, i on se komita tom tipu. Odnosno, pravi monomorfan ili konkretan tip, pri čemu nadalje nije moguće mijenjati tip datog simbola ili izraza. Međutim, ukoliko nema aplikacije i ne postoji način na koji kompajler može da zaključi iz definicije tip izraza ili simbola, po defaultu zaključuje da je u pitanju int.
Da li je moguće eksplicitno navesti ulazni ili izlazni tip neke funkcije, a da kompajler zaključi izlazni, odnosno ulazni tip?
Ukoliko koristimo Sugar Syntax verziju let izraza, to je moguće. Moguće je navesti eksplicitno tip ulaznog podatka, a da kompajler zaključi tip izlaznog podatka let imefje (x:tip_ul) = expr1 in expr2, ili navesti tip izlaznog podatka, a da kompajler zaključi tip ulaznog podatka let imefje x : tip_izl = expr1 in expr2, što nije moguće za verziju let izraza koja nema Sugar Syntax. Tu je moguće samo eksplicitno navesti oba tipa ili prepustiti kompajleru da oba zaključi.
Šta se desi kada koristimo ključnu riječ inline?
Ključna riječ inline označava da funkcija koja se definira nije više monomorfna već postaje polimorfna, slično u templateu u imperativnom programiranju, odnosno C++. I to postaje compile time polimorfna.