ULOHY ------- 1. Pomocou funkcie iterate zapiste nasledovne zoznamy: a) [0,1,2,0,1,2,0,...] b) [1,2,4,5,7,8,10,...] c) [[], [[]], [[[]]], ...] d) "AAAAAAAAAA..." e) [(True, 5), (False, -6), (True, 7), (False, -8), ...] f) [(^2), (\t -> t^4), (^8), (\t -> t^16), ...] 2. Skuste sa zamysliet (fakt, skuste to!) a urcte, co je vysledkom vyhodnotenia nasledovnych vyrazov: a) f n = [ x | x <- [1..n], y <- [1..n]] b) f n = [ x | x <- [1..n], y <- [1..x]] c) f n = [ (x, y) | x <- [1..y], y <- [1..n]] d) f n = [ (x + z, y + z) | x <- [1..n], y <- [x..n], z <- [0,1] ] e) [ x | x <- [ t | t <- [1..], odd t ], even x ] f) [ [ m | m <- [1] ] | s <- [] ] RIESENIA ---------- 1. Uvedene su len argumenty f, x. a) (flip mod 3 . (+1)) 0 b) (\x -> if mod x 3 == 2 then x + 2 else x + 1) 1 c) neda sa, ked by sme sa pozreli na pociatocnu cast zoznamu obsahujucu k prvkov, tak by sme dostali typ [...[a]...] s k zoznamovymi zatvorkami, avsak takto by sme mohli ist donekonecna, teda takyto zoznam nie je otypovatelny; avsak, ak by to slo, tak riesenim by mohlo byt napriklad iterate (:[]) [] alebo este inak - iterate :: (a -> a) -> a -> [a], avsak (:[]) :: b -> [b], co je nekompatibilny typ s a -> a d) id 'A' pretoze "AAAA..." = ['A','A','A',...] e) (\(b, n) -> (not b, if b then -n - 1 else -n + 1) (True, 5) f) (.(^2)) (^2) alebo ((^2).) (^2) alebo (\f -> f . (^2)) (^2) 2. a) najprv sa budu generovat hodnoty x a nasledne y, t.j. (x,y) budu taketo: (1,1), (1,2), ..., (1,n), (2,1), (2,2), ..., (2,n), ... teda vyraz sa vyhodnoti na [1, 1, ..., 1, 2, 2, ..., 2, ..., n, n, ... n] ( n-krat ) ( n-krat ) ( n-krat ) b) opat je dolezite poradie: vygeneruje sa hodnota z x a pre nu sa vygeneruju y z rozsahu 1 az x, teda dostnaeme [1, 2, 2, 3, 3, 3, 4, 4, 4, 4, ...] c) na chybovu spravu :) premenna y v [1..y] v danom mieste nie je definovana d) [[1,1],[2,2], [1,2],[2,3], ..., [1,n],[2,n+1], [2,2],[3,3], [2,3],[3,4], ..., [2,n],[3,n+1], ..., [n-1,n-1],[n,n], [n-1,n],[n,n+1], [n,n],[n,n+1] ] e) najprv sa pozrieme na [ t | t <- [1..], odd t ]; tento zoznam vygeneruje vsetky prirodzene cisla, ktore su neparne, zacinajuc od 1, teda je to ekvivalnentne [1,3..] a co robi [ x | x <- [1,3..], even x ]? postupne vybera zo zoznamu neparne cisla, ale ziadne neprejde testom parnosti, takze jedine, co nam interpret vypise, je znak [ a vypocet sa nikdy neskonci, pretoze interpret netusi, ze sme mu zakerne dali iba neparne cisla, takze nevypise nic; a zaroven je zoznam nekonecny, takze k vypisu ] nedojde (cize [] nie je spravna odpoved) f) [ m | m <- [1] ] = [1] [ [1] | s <- [] ] sa vyhodnoti na [], pretoze v generatore napravo nie je ziadny prvok