Kaheksas praktikum
Eksami Haskelli ülesannete näidised.
1.
Kirjuta funktsioon f
, mis saab argumendiks kolmikute (x,y,z)
listi ja tagastab paari (a,b)
. Tagastatud paari teine komponent b
on argumentide kolmandate komponentide z
summa. Tagastatud paari esimene komponent a
on list mis koosneb argumendi esimestest komponentidest x
, kusjuures x
esineb a
-s y
korda ning x
-d on a
-s vastupidises järjekorras.
Näiteks:
-- [] -> ("",0) -- [('a', 1, 1.0)] -> ("a", 1.0) -- [('x', 2, 4.0), ('y', 3, 1.0)] -> ("yyyxx",5) -- [('x', 2, 4.0), ('y', 3, 2.0)] -> ("yyyxx",6) -- [('x', 2, 4.0), ('y', 1, 1.0)] -> ("yxx",5) -- [('x', 2, 4.0), ('y', 0, 1.0)] -> ("xx",5) -- [('x', 2, 4.0), ('y', 3, 2.0), ('z',2,1.0)] -> ("zzyyyxx",7) f :: [(a, Int, Double)] -> ([a], Double) f = undefined
2.
Kasutades foldr
, kirjuta funktsioon g
, mis võtab argumendiks täisarvude listi ja tagastab ()
-de listi. Tühjale listile vastata väärtusega [(),(),(),()]
ning iga 0
-i kohta argumendis tuleb tagastada ühe võrra vähem ()
-ge.
Näiteks:
-- [] --> [(),(),(),()] -- [0,0,1] --> [(),()] -- [0,1,0] --> [(),()] -- [1,0,0] --> [(),()] -- [8,0,9] --> [(),(),()] -- [0,0,0] --> [()] -- [0,0,0,0] --> [] -- [0,0,0,0,0,0] --> [] g :: [Int] -> [()] g = foldr undefined undefined
3.
Kirjuta protseduur h
, mis võtab kaks täisarvulist argumenti: n
ja m
. Protseduur genereerib (randomRIO
-ga näiteks) n
juhuslikku täisarvu lõigust [0, m]
. Esmalt trükitakse konsooli genereeritud arvude summa ning seejärel genereeritud arvud (iga arv eri reale).
Näiteks:
-- > h 3 10 -- 14 -- 7 -- 5 -- 2
h :: Int -> Int -> IO () h = undefined
4.
Olgu antud järgnev andmestruktuur, kus E on graafi servade tüübipere ja G on graafide tüübipere.
data E a = E a String a deriving (Eq) data G a = G [a] [E a] deriving (Eq, Show) instance Show a => Show (E a) where show (E _ s _) = s -- Näiteks on antud selline graaf: g1 = G [1,2,3,4] [E 1 "a" 2, E 2 "b" 3, E 2 "c" 4, E 4 "d" 1]
Kirjutage funktsioon teedAlates g x ys , kus g on graaf, x on tipp ja ys on tippude list. Funktsioon peab väljastama kõikide mittetsükliliste teede listi, mis lähtuvad tipust x ja mis ei sisalda tippe listist ys.
Näiteks:
> teedAlates g1 1 [] [[],[a],[a,b],[a,c]] > teedAlates g1 2 [] [[],[b],[c],[c,d]]
teedAlates :: Eq a => G a -> a -> [a] -> [[E a]] teedAlates = undefined
5+
Kodutöö küsimused (või nende puudumisel eelmiste nädalate poolelijäänud ülesanded).