3. Haskelli kodutöö
Lahenda järgmised ülesanded Haskelli moodulisse Kt3
.
Moodle'ist leiad ka lahendusfaili malli Kt3.hs
.
1. ülesanne (0.3p)
Kirjuta listi ümberpööramise funktsioon reverse'
, kasutades foldl
-i.
Näiteks:
reverse [] ==> [] reverse [1,2,3] ==> [3,2,1]
reverse' :: [a] -> [a] reverse' = foldl (#) a where a = undefined x # y = undefined
2. ülesanne (0.3p)
Kirjuta foldr
-ga funktsioon eemaldaNullid
, mis eemaldab listist kõik nullid.
Teised listi elemendid peavad jääma samasse järjekorda.
Näiteks:
eemaldaNullid [] ==> [] eemaldaNullid [1,0,1,0,2] ==> [1,1,2] eemaldaNullid [1,1,0,0,2] ==> [1,1,2] eemaldaNullid [0,0,0,6,0] ==> [6]
eemaldaNullid :: [Int] -> [Int] eemaldaNullid = foldr (#) a where a = undefined x # y = undefined
3. ülesanne (0.4p)
Kasutades foldr
-i, kirjuta funktsioon any'
, mis võtab argumendiks predikaadi ja listi.
Tagasta True
ainult siis, kui leidub listi element, mis rahuldab predikaati.
(Vihje: ||
on disjunktsiooni operaator)
Näiteks:
any' isUpper "Tere!" ==> True -- kuna isUpper 'T' == True any' isUpper "terE!" ==> True -- kuna isUpper 'E' == True any' isUpper "tere!" ==> False
any' :: (a -> Bool) -> [a] -> Bool any' p xs = undefined
isUpper
funktsiooni kasutamiseks lisa faili päisesse import Data.Char
.
4. ülesanne (0.4p)
Kasutades mõnda kõrgemat järku funktsiooni (nt foldr
), kirjuta funktsioon allEqual
, mis kontrollib, kas täisarvude listi kõik elemendid on võrdsed.
Näiteks:
allEqual [] ==> True allEqual [1,2] ==> False allEqual [1,1,1] ==> True allEqual [1,2,1] ==> False
allEqual :: [Int] -> Bool allEqual xs = undefined
5. ülesanne (0.4p)
Kasutades funktsiooni foldr
, kirjuta funktsioon unzip'
, mis jagab paaride listi kaheks eraldi listiks.
Näiteks:
unzip' [(1,'x'), (4,'1'), (2,'p')] == ([1, 4, 2], ['x', '1', 'p']) unzip' [] == ([], [])
unzip' :: [(a, b)] -> ([a], [b]) unzip' = foldr f b where b = undefined f = undefined
6. ülesanne (0.4p)
Genereerida listikomprehensiooniga lõpmatu list, mille elemendid on kasvavas järjestuses selliste paarisarvude kuubid, mille ruudu täisarvulisel jagamisel seitsmega saadakse jääk kaks,
st. 64, 1000 jne. kuna 4^3=64, 4*4 =16, 16 `mod` 7 = 2, 10^3=1000, 10*10=100, 100 `mod` 7 = 2.
arvud1 :: [Int] arvud1 = undefined
7. ülesanne (0.4p)
Defineerida sama list 6. ülesandest, kuid listikomprehensiooni asemel
kasutades iterate
, filter
ja map
funktsioone.
arvud2 :: [Int] arvud2 = undefined
8. ülesanne (0.4p)
Genereerida lõpmatu list elementidega: 0, 1, -1, 2, -2, 3, -3 jne.
hajuvad :: [Int] hajuvad = undefined
Siin võid ise valida, milliseid vahendeid (rekursioon, kõrgemat järku funktsioonid, listikomprehensioon) ja kuidas kasutad.