• Nie Znaleziono Wyników

Języki i paradygmaty programowania Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej 1/19

N/A
N/A
Protected

Academic year: 2021

Share "Języki i paradygmaty programowania Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej 1/19"

Copied!
19
0
0

Pełen tekst

(1)

dr Dariusz Wardowski, Katedra Analizy Nieliniowej 1/19

(2)

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.

(3)

dr Dariusz Wardowski, Katedra Analizy Nieliniowej 3/19

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

(4)

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]

(5)

dr Dariusz Wardowski, Katedra Analizy Nieliniowej 5/19

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]

(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”

(7)

dr Dariusz Wardowski, Katedra Analizy Nieliniowej 7/19

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]

(8)

Operator pobieranie elementu listy (!!) Typ : (!!)::[a]->Int->a

Przykład użycia:

?>[6,8,10,23]!!2 10

(9)

dr Dariusz Wardowski, Katedra Analizy Nieliniowej 9/19

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”+

(10)

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].

(11)

dr Dariusz Wardowski, Katedra Analizy Nieliniowej 11/19

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]]

(12)

Przykłady

Funkcja wyznaczająca max trzech liczb

maks3 :: Integer -> Integer -> Integer -> Integer maks3 a b c

| a>=b && a>=c = a

| b>=a && b>=c = b

| c>=a && c>=b = c

(13)

dr Dariusz Wardowski, Katedra Analizy Nieliniowej 13/19

Funkcja obliczająca sumę elementów listy sum :: Num a => [a] -> a

sum [] = []

sum (x:xs) = x + suma xs

(14)

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]

(15)

dr Dariusz Wardowski, Katedra Analizy Nieliniowej 15/19

Wszystkie pary liczb naturalnych których suma wynosi 100.

lista :: [(Int, Int)]

lista = [(x,y) | x <- [1..100], y<- [1..100], x+y == 100]

(16)

Funkcja odwracania listy odwr :: [a] -> [a]

odwr [] = []

odwr (x:xs) = odwr xs ++ [x]

(17)

dr Dariusz Wardowski, Katedra Analizy Nieliniowej 17/19

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

(18)

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

(19)

dr Dariusz Wardowski, Katedra Analizy Nieliniowej 19/19

KONIEC

Dziękuję za uwagę 

Cytaty

Powiązane dokumenty

Innymi słowy, funkcja (w sensie matematycznym) definiuje wartośd, ale nie określa ciągu działao na wartościach w pamięci, które mogłyby ją wytworzyd... dr Dariusz Wardowski,

W przypadku ukonkretniania całkowitego zmienna utożsamia się z termem niezawierającym zmiennych i nie podlega dalszemu ukonkretnianiu. W tym momencie można ją postrzegad

•Jeżeli obiekt utworzono w sposób dynamiczny (tzn. za pomocą operatora new), wówczas destruktor tego obiektu jest wywoływany automatycznie, gdy użyjemy delete do

Konstruktory, które posiadają jeden argument mogą pełnić rolę funkcji konwersji, czyli mechanizmu, który przekształca wartość argumentu na typ

Jeżeli wskaźnik (referencja) wskazuje na obiekt typu B, wówczas nastąpi wywołanie destruktora ~B() klasy potomnej, a następnie ~A() klasy macierzystej... Wiązanie statyczne

Jeżeli klasa dziedziczy z klas, które dziedziczą po wirtualnej klasie macierzystej, wówczas konstruktor tej pierwszej klasy musi jawnie wywoływad konstruktor tej drugiej klasy.

Dobrym rozwiązaniem jest zamiana powyższych klas na jedną definicję szablonu, posługując się tzw..

Definiując szablon klasy możemy korzystać zarówno z wartości domyślnych dla parametrów typu jaki i wartości domyślnych dla argumentów wyrażeń (nie-typów).. Definiując szablon