· 9 years ago · Oct 10, 2016, 08:30 AM
1module Yl5 where
2
3import System.Random
4import Data.List ((\\), intercalate)
5
6data Email = E String String
7
8instance Show Email where
9 show (E aadress domeen) = aadress ++ ('@':domeen)
10
11kalmer, vesal, varmo :: Email
12kalmer = E "kalmer.apinis" "ut.ee"
13vesal = E "vesal" "ut.ee"
14varmo = E "varmo.vene" "ut.ee"
15
16anti = E "antiingel" "gmail.com"
17hiie = E "hiievill" "gmail.com"
18kristine = E "kristineleetberg" "gmail.com"
19rmr = E "raul-martin.rebane" "ut.ee"
20
21opilane = E "oskar" "ohakas.ee"
22
23-- 1) Implementeerige show operaator e-maili andmestruktuuri jaoks nii,
24-- et ülaldefineeritud aadressid näidataks standardsel kujul:
25-- show kalmer ==> "kalmer.apinis@ut.ee"
26
27
28
29data Kiri = K {
30 saatja :: Email,
31 saaja :: [Email],
32 bcc :: [Email],
33 pealkiri :: String,
34 sisu :: String
35}
36
37-- 2) Kirjutage Kiri tüüpi väärtus, mis tähistaks kirja teilt aine
38-- Programmeerimiskeeled korraldajatele.
39testkiri :: Kiri
40testkiri = K { saatja = opilane, saaja = [vesal, kalmer, varmo], bcc = [anti,hiie,kristine,rmr],
41 pealkiri = "tere", sisu = "tere"}
42
43-- 3) Kirjutada funktsioon saadaKiri, mis valmistab ette kirjade
44-- saatmist erinevatele adressaatidele. Arvutada list paaridest, kus
45-- paari komponendid on kirja saajad (ka bcc) koos nendele adresseeritud
46-- kirjaga. (bcc väli tuleb tühjendada)
47saadaKiri :: Kiri -> [(Email, Kiri)]
48saadaKiri kiri = saajaK ++ bccK
49 where --saajaK = map (\s -> ( s , kiri {bcc=[]} ) ) (saajad)
50 saajaK = [ ( s , kiri {bcc=[]}) | s<-saajad]
51 bccK = [ ( b , kiri{bcc=[], saaja=(b:saajad)} ) | b <- (bcc kiri) ]
52 --bccK = map (\b -> ( b , kiri {bcc=[],saaja=(b:(saajad))} ) ) (bcc kiri)
53 saajad = saaja kiri
54
55data Tree a = Leaf | Branch (Tree a) a (Tree a)
56 deriving (Show)
57
58instance Foldable Tree where
59 foldr f acc Leaf = acc
60 foldr f acc (Branch l v r) = foldr f paremalt l
61 where paremalt = f v (foldr f acc r)
62
63toList :: Tree a -> [a]
64toList = foldr (:) []
65
66--toList :: Tree a -> [a] -> [a]
67--toList Leaf acc = acc
68--toList (Branch l v r) acc = toList l paremalt
69-- where --paremalt = v : (toList r acc)
70-- paremalt = (:) v (toList r acc)
71
72puu1, puu2, puu3 :: Tree Int
73puu1 = Branch (Branch Leaf 1 Leaf) 6 Leaf
74puu2 = Branch Leaf 1 (Branch Leaf 6 Leaf)
75puu3 = Branch (Branch Leaf 1 Leaf) 8 Leaf
76
77memberOf :: Eq a => a -> Tree a -> Bool
78memberOf _ Leaf = False
79memberOf x (Branch left y right)
80 | x == y = True
81 | otherwise = x `memberOf` left || x `memberOf` right
82
83-- 4) Kirjuta ülaldefineeritud puu andmetüübi jaoks Eq instants nii,
84-- et see kontrollib, kas kõik puu elemendid eksisteerivad teise puu
85-- sees. (Soovituslik on kasutada funktsiooni memberOf.)
86--
87-- *Yl5> puu1 == puu3
88-- False
89-- *Yl5> puu1 == puu2
90-- True
91-- *Yl5> puu1 == puu1
92-- True
93--
94instance Eq a => Eq (Tree a) where
95 x /= y = not (x == y)
96 --Leaf == _ = True
97 --Branch l v r == y = memberOf v y && l == y && r == y
98 x == y = null (listx \\ listy) && null (listy \\ listx)
99 where listx = toList x
100 listy = toList y
101
102
103-- 5) Kirjutada protseduur saatmised, mis kirjutab eraldi ridadele
104-- kirja saatja, siis sõne " --> " ning lõpuks saaja emaili aadressi.
105-- Näiteks:
106-- *Yl5> saatmised testkiri
107-- kalmer.apinis@ut.ee --> varmo.vene@ut.ee
108-- kalmer.apinis@ut.ee --> vesal@ut.ee
109saatmised :: Kiri -> IO ()
110saatmised kiri = do
111 let saajad = saaja kiri ++ bcc kiri
112 let stj = saatja kiri
113 let soned = map (\x -> show stj ++ " --> " ++ show x) saajad
114 --abi soned
115 --putStrLn $ intercalate "\n" soned
116 mapM_ putStrLn soned
117
118abi :: [String] -> IO()
119abi [] = return ()
120abi (x:xs) = do
121 putStrLn x
122 abi xs
123
124-- 6) Kirjutada protseduur juhuslik, mis tagastab juhusliku arvu,
125-- sellest arvust sõltumata juhusliku tähe ('a'-st 'z'-ni) ning
126-- tagastab kolmiku. Juhuslike andmete genereerimiseks kasutada
127-- randomRIO :: Random a => (a, a) -> IO a
128-- Tagastatava kolmiku sõne osas korrata genereeritud arvu ja tähe.
129-- Sõnekomponendis kasutada let-konstruktsiooni.
130-- Näide:
131-- *Yl5> juhuslik
132-- ("char:m int:9",9,'m')
133-- *Yl5> juhuslik
134-- ("char:i int:72",72,'i')
135juhuslik :: IO (String, Int, Char)
136juhuslik = do
137 taht <- randomRIO('a','z')
138 arv <- randomRIO(0,100)
139 return ("",arv,taht)
140
141
142-- 7) Kirjutada protseduur kummaline, mis
143-- 1. loeb konsoolist rea xs (protseduuriga getLine),
144-- 2. genereerib juhuslikud arvu n (protseduuriga juhuslik) ja
145-- 3. kirjutab "Jah!" kui konsoolilt sisestati arv n, muidu "Ei!".
146-- (Sõnest arvuks teeb funktsioon read :: Read a => String -> a.)
147kummaline :: IO ()
148kummaline = do
149 rida <- getLine
150
151 (_,arv,_) <- juhuslik
152 if read rida == arv
153 then putStrLn "Jah!"
154 else do
155 print arv
156 putStrLn "Ei!"