p3 Flashcards

1
Q

Šta je specifično pri aplikaciji lambda?

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Kada se dešava pattern matching?

A

Tokom runtime-a.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Koji je ekvivalentan izraz sljedećem let izrazu: let imefje = (fun pat -> expr1) in expr2

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Kako se formiraju jezički blokovi u F# programskom jeziku?

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Kojeg je tipa lambda

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Kako kompajler radi type inference?

A

Kompajler radi type inference na osnovu Henry–Milner type inference teorije

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Šta sve ima tip?

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Kako kompajler zaključuje tip na osnovu Henry-Milner teoreme?

A

Kompajler sam zaključuje tip na osnovu konteksta upotrebe uzorka i tipa vrijednosti

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Kakav tip mora biti unutar jednog izraza?

A

Tip mora biti jednoznačan, obzirom da u F# programskom jeziku ne postoji implicitna konverzija.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Kako se eksplicitno anotira tip nekog simbola?

A

ime_simbola : tip.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Ukoliko tip vrijednosti i tip anotacije nekog simbola nisu isti, šta će se desiti?

A

Doći će do greške u kompiliranju. Neće doći do iznimke, već error

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Navesti oblik potpune anotacije za let izraz koji jeste i koji nije Sugar syntax.

A

Za Sugar syntax: let fja (x : tip1) : tip2 = expr1 in expr2. Za non Sugar syntax: let fja : tip1 -> tip2 = (fun x -> expr) in expr2.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Šta se desi kada kompajler zaključi tip?

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Da li je moguće eksplicitno navesti ulazni ili izlazni tip neke funkcije, a da kompajler zaključi izlazni, odnosno ulazni tip?

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Šta se desi kada koristimo ključnu riječ inline?

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Ukoliko je funkcija definisana kao inline, kakve tipove zaključuje kompajler?

A

Kompajler i za tu funkciju, iako je polimorfna, zaključuje tipove. Međutim, u pitanju su tipovi ^A -> ‘B. Tako da se pri svakoj aplikaciji, gdje su A i B placeholderi za konkretne tipove, od poziva napravi konkretna monomorfna funkcija izraza i zamijene se A i B za konkretnim tipovima.

17
Q

Gdje se sintaktički postavlja ključna riječ inline?

A

Ključna riječ inline se nalazi između let i imena funkcije.

18
Q

Kada type inference od strane kompajlera nije više moguć, da se tipovi moraju anotirati?

A

Ako se koriste objektno orijentirani programski alati u F# programskom jeziku, u tom slučaju type inference više nije moguć i potrebno je navesti, odnosno anotirati tipove.

19
Q

Polimorfizam koji se postiže ključnom riječu inline je kakav?

A

To je compile time polimorfizam.

20
Q

Koji je proces aplikacije sa polimorfnim funkcijama?

A

Prvo se traži da li postoji monomorfna funkcija koja uzima konkretan tip i ukoliko postoji, pozove se ta verzija. Međutim, ako ne postoji, gleda se da li postoji polimorfna funkcija od koje se može napraviti monomorfna funkcija i ona se poziva.