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