Programowanie Studia Licencjackie Lista 13.
Transkrypt
Programowanie Studia Licencjackie Lista 13.
Programowanie Studia Licencjackie Lista 13. Zadanie 1. Zdefiniuj następujące funkcje: a) forall p L sprawdzającą, czy na liście L wszystkie elementy spełniają p. b) flatten xs, która spłaszcza listę list, czyli przykładowo flatten [ [1,2], [3,4] ] powinno dać [1,2,3,4]. c) drop n xs, która zwraca listę xs bez pierwszych n elementów. Jakie mają one typy? Zadanie 2. Funkcja combine zdefiniowana jest następująco: combine [] = [] combine (x:xs) (y:ys) = (x,y) : combine xs ys W Haskellu występuje konstrukcja let Wzorzec=Wyrażenie in Wyrażenie2, która dopasowuje Wyrażenie do Wzorca, ustalając w ten sposób wartości zmiennych we wzorcu, po czym wartości te używane są podczas obliczania wartości Wyrażenia2. Napisz dwie wersje funkcji odwrotnej do combine, wykorzystując w jednej z nich konstrukcję let. Zadanie 3. (2p) Napisz funkcję perm xs, która zwraca listę wszystkich permutacji xs w dowolnym porządku. Zadanie 4. (2p) Napisz funkcję subsets xs, która zwraca listę wszystkich podzbiorów xs. Podzbiory reprezentuj jako listy, w liście wynikowej każdy podzbiór powinien mieć dokładnie jednego reprezentanta. Zadanie 5. Poniżej są definicje dwóch standardowych funkcji: foldl f z [] foldl f z (x:xs) = z = foldl f (f z x) xs foldr f z [] foldr f z (x:xs) = z = f x (foldr f z xs) Podaj ich typy i opisz ich działanie. Zadanie 6. Wyraź funkcje forall, filter, exists, flatten, map za pomocą foldl oraz foldr. Zadanie 7. Napisz funkcję odwracającą listy za pomocą za pomocą foldl albo foldr. Zadanie 8. Do czego może służyć następująca funkcja (i jaki ma typ): fun funny f 0 = (fn x=>x ) funny f n = if n mod 2 then funny else funny | = 0 (f o f) (n div 2) (f o f) (n div 2) o f; Jak można ją wykorzystać do odwracania listy? Zadanie 9. Podaj najogólniejsze typy (lub uzasadnij, że nie istnieją) dla funkcji zdefiniowanych w następujący sposób: a) f x y = x () y b) f x y = (y x, x() ) c) f x y = x(y,y) d) f x y = ([y], x:y) e) f x y = ([x]:[y],[[y]]) f) f x y = x y == () g) f x y = x (y == y) h) f x y = x ++ y:y Pusta krotka, czyli () ma oczywiście typ (). Zadanie 10. Zdefiniuj w Hakellu listę primes będącą nieskończoną listą wszystkich liczb pierwszych. Przedstawe definicję na tablicy, natomiast na kartce zasymuluj obliczenia dla take 3 primes. Zadanie 11. Sortowanie przez scalanie (mergesort) jest algorytmem w którym listę dzielimy na dwie części o równej długości, sortujemy je rekurencyjnie a następnie scalamy, by powstała lista posortowana. Napisz w języku funkcjonalnym funkcję mergesort, która sortuje listy tą metodą. 2