Table of Contents
#+title Ćwiczenia
1 Wymagania
Dla wszystkich funkcji należy jawnie podać typ. Powinien to być typ jak najogólniejszy.
2 Proste funkcje
2.1 Przykład: funkcja podzielnePrzez3
:
podzielnePrzez3 :: Integral a => a -> Bool podzielnePrzez3 n = n `mod` 3 == 0
2.2 Zadania
2.2.1 toSamo
Zdefiniować funkcję, która zwraca swój argument.
toSamo 3 |
⇒ 3 |
toSamo [1,2,3] |
⇒ [1,2,3] |
2.2.2 kwadrat
Zdefiniować funkcję, która zwraca kwadrat swojego argumentu.
kwadrat 3 |
⇒ 9 |
2.2.3 pusta
Zdefiniować funkcję, która sprawdza, czy lista jest pusta.
pusta [] |
⇒ True |
pusta [1,2,3] |
⇒ False |
3 Funkcje rekurencyjne
3.1 Zadania
3.1.1 silnia
3.1.2 fibonacci
3.1.3 ileRazyPrzez
Zdefiniować funkcję, która sprawdza, ile razy liczba jest podzielna bez reszty przez 3.
ileRazyPrzez 2 24 |
⇒ 3 |
ileRazyPrzez 7 |
⇒ 0 |
4 Obliczenia rekurencyjne na listach
4.1 Zadania
4.1.1 długość
Zdefiniować funkcję, która zwraca długość listy.
długość [] |
⇒ 0 |
długość [1,2,3] |
⇒ 3 |
4.1.2 suma
Zdefiniować funkcję, która zwraca sumę wszystkich elementów listy (dla listy pustej - 0).
suma [] |
⇒ 0 |
suma [1,2,3,4,5] |
⇒ 15 |
4.1.3 sumaLog
Zdefiniować funkcję, która zwraca sumę logiczną wszystkich elementów listy typu [Bool].
sumaLog [] |
⇒ False |
sumaLog [True,False,True] |
⇒ True |
sumaLog [False,False] |
⇒ False |
4.1.4 maxB
Zdefiniować funkcję, która zwraca najwięjszy element listy. Jeśli lista jest pusta, zwraca najmniejszą wartość należącą do danego typu. Funkcja działa tylko dla list, których wartości są typu należącego do klasy Bounded.
4.1.5 następne
Zdefiniować funkcję, która bierze jako argument listę i przekształca ją w ten sposób, że każdy element zastępuje jego następnikiem.
nastepne [1,2,4,8] |
⇒ [2,3,5,9] |
nastepne "Ala ma kota." |
⇒ "Bmb!nb!lpub/" |
4.1.6 parzyste
Zdefiniować funkcję, która bierze jako argument listę liczb i
przekształca ją w ten sposób, że każdy element zastępuje wartością
True
, jeśli jest to liczba parzysta, wartością False
, jeśli
nie.
parzyste [1,2,3,4] |
⇒ [False,True,False,True] |
5 Funkcje wyższych rzędów I
5.1 mapowanie
Zdefiniować funkcję mapowanie
, będącą uogólnieniem funkcji
następne
i parzyste
. Funkcja mapowanie
bierze dwa argumenty:
funkcję, którą ma zastosować do przekształcania elementów i listę
elementów do przekształcenia.
mapowanie signum [-2,-1,0,1,2] |
⇒ [-1,-1,0,1,1] |
mapowanie null [[],[2,3],[]] |
⇒ [True,False,True] |
5.1.1 następne'
Z wykorzystaniem funkcji mapowanie
, zdefiniować funkcję
następne'
, która działa tak samo, jak funkcja następne
.
5.1.2 parzyste'
Z wykorzystaniem funkcji mapowanie
, zdefiniować funkcję
parzyste'
, która działa tak samo, jak funkcja parzyste
.
5.2 redukcja
Zdefiniować funkcję redukcja
, będącą uogólnieniem funkcji
długość
, suma
, sumaLog
i maxB
. Funkcja redukcja
bierze
trzy argumenty:
- funkcję, którą ma zastosować na aktualnej wartości i wyniku rekurencyjnego zastosowania siebie na reszcie listy;
- wartość, od której zaczyna (tzn. wartość dla pustej listy);
- listę na której ma wykonać rekurencyjne obliczenie.
Np. sumę elementów listy (przyjmując, że dla listy pustej zwracamy 0) oraz długość listy powinniśmy móc obliczyć tak:
redukcja (+) 0 [1,2,3,4,5] |
⇒ 15 |
redukcja (\_ n -> n+1) [1,2,3,4,5] |
⇒ 5 |
5.2.1 długość'
Z wykorzystaniem funkcji redukcja
, zdefiniować funkcję
długość'
, która działa tak samo, jak funkcja długość
.
5.2.2 suma'
Z wykorzystaniem funkcji redukcja
, zdefiniować funkcję
suma'
, która działa tak samo, jak funkcja suma
.
5.2.3 sumaLog'
Z wykorzystaniem funkcji redukcja
, zdefiniować funkcję
sumaLog'
, która działa tak samo, jak funkcja sumaLog
.
5.2.4 iloczynLog'
Z wykorzystaniem funkcji redukcja
, zdefiniować funkcję
iloczynLog'
.
5.2.5 maxB'
Z wykorzystaniem funkcji redukcja
, zdefiniować funkcję
maxB'
, która działa tak samo, jak funkcja maxB
.
6 Złożenie funkcji
6.1 Przykład
- ↓
maParzystąDługość :: [a] -> Bool maParzystąDługość l = even (length l)
maParzystąDługość [1,2,3]
maParzystąDługość [1,2,3,4]
- ↓
maParzystąDługość' :: [a] -> Bool maParzystąDługość' l = (even . length) l
maParzystąDługość' [1,2,3]
maParzystąDługość' [1,2,3,4]
- ↓
maParzystąDługość'' :: [a] -> Bool maParzystąDługość'' = even . length
maParzystąDługość'' [1,2,3]
maParzystąDługość'' [1,2,3,4]
6.2 wszystkieParzyste
Zaimplementować funkcję "wszystkieParzyste" z wykorzystaniem
funkcji parzyste'
i iloczynLog'
wszystkieParzyste [1,2,3,4,5] |
⇒ False |
wszystkieParzyste [2,4] |
⇒ True |