ULOHY ------- 1. Ktore z vyrazov su korektne? a) (5 > 2) == even 1 b) n != m * 3 c) if (n + diff) then "OK" else "Err" d) not (not a || B) e) if (x is Bool) then x else False f) if True then True else True g) 3 `+` 8 - n h) (*) 2 5 - 6 i) even n + 1 j) (let xVar = 13 + pi / 2 in xVar + 1 / xVar) + f xVar k) if (let x = 3 in x * x + 2) == 9 then 0 else 1.91 l) (+) m) "ABC" + "DEF" n) 10 * let x = dlhaPremenna in 2 * x - cos x o) cos sin 10 p) (*) ((+) 2 ((-) n 3)) (9 `mod` (13 - ((*) 5 2))) q) + (10 - n) (n ^ 2) r) (17 - 3) (*) m s) (8 / 2 + 1) `mod` 3 2. Vyhodnotte nasledujuce vyrazy a) 2 + 5 ^ 3 * 2 - 8 > 41 || even (5 ^ 19) b) let x = 3 in let {x = 4; y = 10} in x * y c) True == False || True /= False && True d) (*) (sin 0) (cos 0 ^ sqrt 2) e) if (if not True then False else True) then not True || False else True == False f) sqrt 16 + 9 3. pomocou let vyberte co najviac najvacsich spolocnych podvyrazov z (a + b) / 2 - c * delta + (sin (a + b) / 2) * c * delta / 5 + sqrt (3 + (a + b) / 2) RIESENIA ---------- 1. a) ok, vyjde False b) nok, v Haskelli sa na oznacenie nerovnosti pouziva /=, nie !=, <> alebo ine c) nok, n + diff nemoze byt typu Bool, pretoze vysledkom scitania je cislo d) nok, premenne musia zacinat malym pismenom, not (not a || b) by bolo spravne e) nok, operator na porovnavanie typu priamo vo vyraze neexistuje f) ok, v podmienke moze byt aj trivialna hodnota g) nok, do spatnych uvodzoviek (backticks) sa moze zapisovat iba funkcia, napr. 3 `mod` 8, 1 `max` 9 h) ok, interpretuje sa ako ((*) 2 5) - 6 i) nok, neinterpretuje sa ako even (n + 1), ale (even n) + 1 j) nok, za predpokladu, ze xVar nie je definovana globalne; platnost xVar definovaneho pomocou let konci zatvorkou ) k) ok, v podmienke mozu byt lubovolne zlozite vyrazy l) ok, operator v prefixovom zapise je sam o sebe korektny vyraz, ako aj napr sin, log, atd. m) nok, na zretazovanie zoznamov sa pouziva operator ++ n) ok, interpretuje sa ako 10 * (let x = dlhaPremenna in (2 * x - cos x)), pricom sa predpoklada, ze dlhaPremenna je niekde globalne definovana o) nok, neinterpretuje sa ako cos (sin 10), ale ako (cos sin) 10 p) ok q) nok, operator v prefixe musi byt uzavreny v ( ), t.j. (+) r) nok, operator v infixe musi byt bez zatvoriek s) nok, pouzitie operatora / znamena, ze vysledok bude vo vseobecnosti necelociselny bez ohladu na konkretny vysledok, avsak funkcia mod akceptuje ako argument iba celociselne hodnoty 2. a) (((2 + ((5 ^ 3) * 2)) - 8) > 41) || (even (5 ^ 19)) True b) ... ~> let {x = 4; y = 10} in x * y ~> 4 * 10 ~> 40 vnutorne let zatieni vonkajsie c) (True == False) || ((True /= False) && True) True d) (*) 0 1 ~> 0 e) if True then (not True || Flase) else (True == False) not True || False False f) 13 3. let {x = (a + b) / 2; y = c * delta} in x - y + sin (a + b) / 2 * y / 5 + sqrt (3 + x)