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