kwalifikator

Transkrypt

kwalifikator
Języki i paradygmaty programowania
dr Dariusz Wardowski, Katedra Analizy Nieliniowej
Wykład 6
1/19
Języki i paradygmaty programowania
Wykład 6
Listy
Dla języka funkcyjnego, w którym rekurencja odgrywa zasadniczą rolę, listy są strukturą
bardzo naturalną. Elastycznośd, z jaką język funkcyjny pozwala działad na listach, jest trudna
do osiągnięcia w „zwykłych” językach.
Listy zapisuje się w Haskellu jako ciąg elementów w nawiasach kwadratowych, rozdzielonych
przecinkami. Wszystkie elementy listy muszą byd tego samego typu.
Przykłady list:
• [1, -2, 6] — lista liczb całkowitych,
• [[1, 2, 3], [4, 5], [6]] — lista list liczb całkowitych,
• [] — lista pusta,
• *’a’, ’x’, ’y’+ — lista znaków,
• „axy” – lista znaków
• *”abC”, ”def”, ”ghi”+ — lista napisów.
dr Dariusz Wardowski, Katedra Analizy Nieliniowej
2/19
Języki i paradygmaty programowania
Wykład 6
Typy list
Jeśli T jest typem, to [T] oznacza listę o elementach typu T.
Przykłady typów list:
• [Integer] – typ listy liczb całkowitych,
• [[Integer]] – typ listy list liczb całkowitych,
• [Char] – typ listy znaków
dr Dariusz Wardowski, Katedra Analizy Nieliniowej
3/19
Języki i paradygmaty programowania
Wykład 6
Operacje na listach
Łączenie list (++)
Do łączenia (konkatenacji) list służy operator ++, listy łączone muszą mied elementy tego
samego typu, np.
• [0, -1] ++ [21, 3, 4] daje [0, -1, 21, 3, 4],
• *’a’, ’b’+ ++ *+ ++ *’c’+ daje *’a’, ’b’, ’c’+,
• „Ala” ++ „ma” ++ „kota” daje „Alamakota”.
Odwracanie list (reverse)
Do odwracanie list służy polecenie reverse, np.:
?> reverse [1,2,3]
[3,2,1]
dr Dariusz Wardowski, Katedra Analizy Nieliniowej
4/19
Języki i paradygmaty programowania
Wykład 6
Ostatni element listy (last)
Funkcja last zwraca ostatni element listy:
Typ funkcji: last::[a]->a
Przykład użycia:
?> last [‘a’,’v’,’m’,’i’]
‘i’
Funkcja take
Typ funkcji: take::Int->[a]->[a]
Przykład użycia:
?> take 3 [1,6,8,10]
[1,6,8]
dr Dariusz Wardowski, Katedra Analizy Nieliniowej
5/19
Języki i paradygmaty programowania
Wykład 6
Pierwszy element listy (head)
Funkcja head zwraca pierwszy element listy:
Typ funkcji: head::[a]->a
Przykład użycia:
?> head [4,5,6,-1]
4
Lista bez pierwszego elementu (tail)
Funkcja tail zwraca listę bez pierwszego elementu listy:
Typ funkcji: tail::[a]->[a]
Przykład użycia:
?> tail „Ala ma kota”
„la ma kota”
dr Dariusz Wardowski, Katedra Analizy Nieliniowej
6/19
Języki i paradygmaty programowania
Wykład 6
Funkcja drop
Typ funkcji: drop::Int->[a]->[a]
Przykład użycia:
?> drop 2 [[1,2],[],[4,5,2],[1],[2,8,-1]]
[[4,5,2],[1],[2,8,-1]]
Operator dodawania elementu do listy (:)
Typ : (:)::a->[a]->[a]
Przykład użycia:
?> 4:[6,8,10,23]
[4,6,8,10,23]
dr Dariusz Wardowski, Katedra Analizy Nieliniowej
7/19
Języki i paradygmaty programowania
Wykład 6
Operator pobieranie elementu listy (!!)
Typ : (!!)::[a]->Int->a
Przykład użycia:
?>[6,8,10,23]!!2
10
dr Dariusz Wardowski, Katedra Analizy Nieliniowej
8/19
Języki i paradygmaty programowania
Wykład 6
Operator aplikacji zbiorowej (map)
Jest to operator, który dla danej funkcji i listy argumentów, stosuje funkcję do
poszczególnych elementów listy.
Typ : map:(a->b)->[a]->[b]
Przykład użycia:
• map (+1) [0, 1, 2] — w wyniku otrzymujemy [1, 2, 3],
• map (>0) [–1, 0, 1, 2] — w wyniku otrzymujemy [False, False, True, True],
• map silnia [0, 3, 6, 9] — w wyniku otrzymujemy [1, 6, 720, 362880].
• map reverse *„abc”, „def”, „gh”+ – w wyniku otrzymujemy *„cba”, „fed”, „hg”+
dr Dariusz Wardowski, Katedra Analizy Nieliniowej
9/19
Języki i paradygmaty programowania
Wykład 6
Filtrowanie list (filter)
Filtrowanie listy polega na wybraniu z listy tylko tych elementów, które spełniają podane
kryterium, i zwróceniu ich jako nowej (zwykle krótszej) listy. Do filtrowania służy
standardowa funkcja filter.
Typ : filter::(a->Bool)->[a]->[a]
Przykład użycia:
• filter (>0) [–1, 0, 2, 3] — w wyniku otrzymujemy [2, 3],
• filter odd [3, 4, 1, 6, 7, 9, 0] — w wyniku otrzymujemy [3,1,7,9].
dr Dariusz Wardowski, Katedra Analizy Nieliniowej
10/19
Języki i paradygmaty programowania
Wykład 6
Tworzenie list z kwalifikatorami
Ogólna postad:
[ wyrażenie | kwalifikator ],
Kwalifikator może byd generatorem lub dozorem (czyli warunkiem). Całośd opisuje listę w
podobny sposób, jak często opisuje się zbiory.
Generator ma postad x <- y, gdzie x jest zmienną lub n-tką zmiennych, a y — wyrażeniem
listowym. Dozór to po prostu wyrażenie logiczne.
Przykłady kilku wyrażeo z kwalifikatorami:
[(x,y)|x<-[1,2,3], y<-[4,5]]
[x*x| x<-[1..10]]
[(x, y) | x <- [1..4], y <- [1..5 – x]]
[x + y | x <- [1..3], y <- [1..3]]
dr Dariusz Wardowski, Katedra Analizy Nieliniowej
11/19
Języki i paradygmaty programowania
Wykład 6
Przykłady
Funkcja wyznaczająca max trzech liczb
maks3 :: Integer
maks3 a b c
| a>=b && a>=c
| b>=a && b>=c
| c>=a && c>=b
-> Integer -> Integer -> Integer
= a
= b
= c
dr Dariusz Wardowski, Katedra Analizy Nieliniowej
12/19
Języki i paradygmaty programowania
Wykład 6
Funkcja obliczająca sumę elementów listy
sum :: Num a => [a] -> a
sum [] = []
sum (x:xs) = x + suma xs
dr Dariusz Wardowski, Katedra Analizy Nieliniowej
13/19
Języki i paradygmaty programowania
Wykład 6
Funkcja sortująca listę
quicksort :: Ord a => [a] -> [a]
quicksort [] = [] qsort (x:xs) = qsort [y | y <- xs, y<x] ++
[x] ++ qsort [y | y <-xs, y>=x]
dr Dariusz Wardowski, Katedra Analizy Nieliniowej
14/19
Języki i paradygmaty programowania
Wykład 6
Wszystkie pary liczb naturalnych których suma wynosi 100.
lista :: [(Int, Int)]
lista = [(x,y) | x <- [1..100], y<- [1..100], x+y == 100]
dr Dariusz Wardowski, Katedra Analizy Nieliniowej
15/19
Języki i paradygmaty programowania
Wykład 6
Funkcja odwracania listy
odwr :: [a] -> [a]
odwr [] = []
odwr (x:xs) = odwr xs ++ [x]
dr Dariusz Wardowski, Katedra Analizy Nieliniowej
16/19
Języki i paradygmaty programowania
Wykład 6
Definicja funkcji filter
filter :: (a -> Bool) -> [a] -> [a]
filter p [] = []
filter p (x:xs) = if p x then x : filter p xs else filter p xs
dr Dariusz Wardowski, Katedra Analizy Nieliniowej
17/19
Języki i paradygmaty programowania
Wykład 6
Funkcja sprawdzająca czy liczba jest pierwsza
czyPierwsza::Integer->Bool
czyPierwsza 1 = False
czyPierwsza n = if (null [x| x<-[2..(n-1)], mod n x == 0]) then
True
else
False
dr Dariusz Wardowski, Katedra Analizy Nieliniowej
18/19
Języki i paradygmaty programowania
Wykład 5
KONIEC
Dziękuję za uwagę 
dr Dariusz Wardowski, Katedra Analizy Nieliniowej
19/19