TU Wien:Funktionale Programmierung VU (Knoop)/Prüfung 2020-01-16
Aufgabe 1 (50%)[Bearbeiten | Quelltext bearbeiten]
Geben Sie Wert und allgemeinsten Typ für t1 bis t7 an! (Der Text enthält vorgeschlagene Lösungen als Kommentare die hier hier weiß gedruckt werden. Durch Auswählen des Texts oder über den Seitenquellcode könnt ihr diese Lösungen lesen/copy-pasten.)
Aufgabe 2 (15% + 25%)[Bearbeiten | Quelltext bearbeiten]
Eine Funktion heißt rle schreiben. rle nimmt eine Liste von Elementen und gibt eine Liste von Tupeln aus, wo der Tupel = (Element a, wie oft ist dieses Element a nacheinander aufgetreten). (Geben Sie auch allgemeinste Typdeklaration!)
Beispiel: rle "aabbaaac" = [('a',2), ('b', 2), ('a',3), ('c', 1)]. oder rle [1,1,1,2,3,3] = [(1,3) ,(2,1), (3,2)]
rle :: (Eq a) => [a] -> [(a,Int)]
rle (x:xs) = (x, 1 + (count x xs)) : rle ( drop ((count x xs)) xs)
rle _ = []
count :: (Eq a) => a -> [a] -> Int
count a (x:xs)
| a == x = 1 + count a xs
| otherwise = 0
count _ _ = 0
Andere Lösung:
rle :: Eq a => [a] -> [(a, Int)]
rle [x] = [(x, 1)]
rle (x:xs)
| x == y = (y, n + 1):ys
| otherwise = (x, 1):ls
where
ls@((y, n):ys) = rle xs
Andere Lösung:
rle :: (Eq a) => [a] -> [(a,Int)]
rle a@(x:_) = (x, length (takeWhile (== x) a)) : rle (dropWhile (== x) a)
rle [] = []
Andere Lösung:
rle :: (Eq a) => [a] -> [(a,Integer)]
rle [] = []
rle (x:xs) = rle' x 1 xs
rle' :: (Eq a) => a -> Integer -> [a] -> [(a,Integer)]
rle' a n [] = [(a,n)]
rle' a n (x:xs)
| a == x = rle' a (n+1) xs
| otherwise = (a,n):(rle' x 1 xs)
Aufgabe 3 (5% + 5%)[Bearbeiten | Quelltext bearbeiten]
Eine Funktion heißt unrle, die reverse von rle ist. Es nimmt die Ausgabetyp von rle und wandelt es wieder zu einer Liste um. (Geben Sie auch allgemeinste Typdeklaration!) Beispiel : unrle( rle s ) = s
unrle :: (Eq a) => [(a,Int)] -> [a]
unrle (x:xs) = help x xs
unrle [] = []
help (a,b) (x:xs) = [a | i <- [1..b]] ++ help x xs
help (a,b) _ = [a | i <- [1..b]]
Andere Lösung:
unrle :: [(a,Int)] -> [a]
unrle ((a,b):r) = [a | i <- [1..b]] ++ unrle r
unrle [] = []
Andere Lösung:
unrle :: [(a,Integer)] -> [a]
unrle [] = []
unrle ((a,n):xs)
| n > 0 = a:unrle ((a,n-1):xs)
| otherwise = unrle xs
Andere Lösung:
unrle :: [(a,Int)] -> [a]
unrle [] = []
unrle ((a,n):xs) = replicate n a ++ unrle xs