Funkcje wyszego rzdu Moduy Tomasz Adamowicz Anna Kostun

  • Slides: 32
Download presentation
Funkcje wyższego rzędu Moduły Tomasz Adamowicz Anna Kostun

Funkcje wyższego rzędu Moduły Tomasz Adamowicz Anna Kostun

Funkcje wyższego rzędu • Funkcja w języku Haskell przyjmuje tylko jeden parametr. Funkcje przyjmujące

Funkcje wyższego rzędu • Funkcja w języku Haskell przyjmuje tylko jeden parametr. Funkcje przyjmujące więcej niż jeden parametr nazywamy funkcjami curry. • Funkcje te - albo jako jeden z parametrów przyjmują funkcję - albo zwracają funkcję. Funkcje wyższego rzędu można porównać do wywołań rekurencyjnych.

Funkcje wyższego rzędu • Funkcje pierwszego rzędu można podzielić na cztery różne typy: Map

Funkcje wyższego rzędu • Funkcje pierwszego rzędu można podzielić na cztery różne typy: Map – funkcje wyższego rzędu które przyjmują jako parametr funkcję dokonującą transformacji danego elementu. Funkcje wyższego rzędu zwracają zazwyczaj listę elementów. Filter – funkcje wyższego rzędu które przyjmują jako parametr funkcję wybierającą określone elementy z listy. Funkcje wyższego rzędu zwracają zazwyczaj listę elementów.

Funkcje wyższego rzędu Fold/Reduce – funkcje wyższego rzędu które mają za zadanie zwrócenie jakieś

Funkcje wyższego rzędu Fold/Reduce – funkcje wyższego rzędu które mają za zadanie zwrócenie jakieś z akumulowanej wartości po tym jak przeszły listę w określony sposób. Currying – funkcja wyższego rzędu, która złożoną wieloargumentową funkcję zamienia na listę funkcji przyjmujących po jednym argumencie i zwracającą na koniec oryginalną funkcję.

Funkcje wyższego rzędu • Przykład sposobu definiowania funkcji: add : : Integer -> Integer

Funkcje wyższego rzędu • Przykład sposobu definiowania funkcji: add : : Integer -> Integer add : : Integer -> (Integer -> Integer) Przyjmuje ona parametr typu Integer oraz zwraca funkcję typu Integer, czyli przyjmuje i zwraca liczbę całkowitą.

Funkcja map • Funkcja map przyjmuje jako parametr funkcję, która będzie użyta na każdym

Funkcja map • Funkcja map przyjmuje jako parametr funkcję, która będzie użyta na każdym elemencie listy. map funkcja lista map : : (a -> b) -> [a] -> [b] Przykłady funkcji map: map sqrt[1, 4, 9] [1. 0, 2. 0, 3. 0] map fst [(‘a’, 1), (‘b’, 2)] "ab" map reverse[”abc”, ”def”, ”ghi”] ["cba", "fed", "ihg"] map (++ "! ") ["Hej" , "Czekaj" , "Wracaj"] [" Hej!" , " Czekaj!" , " Wracaj!"]

Funkcje foldl foldr • Funkcje fold przetwarzają uporządkowane listy danych w celu zbudowania końcowego

Funkcje foldl foldr • Funkcje fold przetwarzają uporządkowane listy danych w celu zbudowania końcowego wyniku przy pomocy funkcji łączącej elementy. • Redukują one listy danych. Litera l lub r oznacza, od której strony funkcja rozpoczyna (od lewej/prawej). foldr funkcja element lista foldl (x y -> 2*x + y) 4 [1, 2, 3] Czyli: (2 *(2 * 4 +1) +2) +3) foldr (x y -> 2*x + y) 4 [1, 2, 3] Czyli: (2 * 1 +(2 * 2 +(2 * 3 + 4)))

Funkcja zip. With • Funkcja ta wywołuje funkcję dla każdej pary elementów, która zwraca

Funkcja zip. With • Funkcja ta wywołuje funkcję dla każdej pary elementów, która zwraca nową listę. zip. With funkcja lista 1 lista 2 let list 1=[1, 2, 3, 4] let list 2=[5, 6, 7, 8] let add a b = a+b zip. With add list 1 list 2 [6, 8, 10, 12] zip. With (>) ”aba” ”baba” [False, True, False]

Funkcje anonimowe λ • Funkcje mogą być konstruowane bez nazywania ich przez użycie wyrażeń

Funkcje anonimowe λ • Funkcje mogą być konstruowane bez nazywania ich przez użycie wyrażeń lambda. Jeśli funkcja jest używana tylko jeden lub ograniczoną liczbę razy, użycie funkcji anonimowej może być wygodniejsze niż użycie funkcji nazwanej. λ x. x+x - funkcja jednoargumentowa zmiennej x λ xy. x+y - funkcja dwuargumentowa zmiennych x i y Zapisujemy je jako: x → x + x xy → x + y Funkcję nazwaną można zamienić na anonimową, np. : dodaj x y = x + y jako funkcja anonimowa jest przedstawiana jako: x y -> x+y

Funkcje anonimowe λ (x y -> x + y) 2 3 5 zip. With

Funkcje anonimowe λ (x y -> x + y) 2 3 5 zip. With (a b -> 2*a + b ) [5, 4, 3, 2, 1] [1, 2, 3, 4, 5] [11, 10, 9, 8, 7] map (x -> x * x) [1. . 5] [1, 4, 9, 16, 25] sum (map (_ -> 1) "Ala ma kota") 11

Funkcja filter • Filtrowanie list - funkcja która przyjmuje jako parametr funkcję, która wykonywana

Funkcja filter • Filtrowanie list - funkcja która przyjmuje jako parametr funkcję, która wykonywana jest na każdym elemencie listy wejściowej, a wartość zwracana tej funkcji jest wartością bool. filter (>3) [1, 5, 3, 2, 1, 6, 4, 3, 2, 1] [5, 6, 4] filter (==3) [1, 2, 3, 4, 5] [3] filter even [1. . 10] [2, 4, 6, 8, 10] filter (x -> length x>4) ["aaaa", "bbbbbbb", "cc"] ["bbbbbbb"]

Funkcje take. While, drop. While • Funkcja take. While – wywołuje funkcję do każdego

Funkcje take. While, drop. While • Funkcja take. While – wywołuje funkcję do każdego elementu listy i wyświetla jej wynik do momentu zwrócenia wartości False. take. While funkcja lista • Funkcja drop. While – wywołuje funkcję do każdego elementu listy i pomija je jeśli funkcja zwraca wartość True. drop. While funkcja sekwencja

Funkcje take. While, drop. While take. While (/=‘m’) ”Ala ma kota” ”Ala” take. While

Funkcje take. While, drop. While take. While (/=‘m’) ”Ala ma kota” ”Ala” take. While (/= ’l’) ”Kot Ali” ”Kot A” drop. While (/=‘k’) ”Ala ma kota” ”kota” drop. While (/= ’l’) ”Kot Ali” "li"

Moduły • Moduł to zbiór powiązanych ze sobą funkcji, typów i typów klas. Język

Moduły • Moduł to zbiór powiązanych ze sobą funkcji, typów i typów klas. Język Haskell stanowi zbiór modułów, gdzie moduł główny odpowiada za zarządzanie pozostałymi modułami. W nich zawarte są funkcje, zdefiniowane do osiągnięcia określonego celu. • Kod podzielony na kilka modułów ma wiele zalet. Jeśli moduł został napisany w sposób ogólny oraz nie jest mocno powiązany z innymi modułami, to funkcje w nim zawarte mogą zostać użyte w wielu innych programach, co czyni pisanie kodu dużo łatwiejszym.

Moduły • Każdy moduł zaczyna się domyślnie od import Prelude, wykonywany jest przed zdefiniowaniem

Moduły • Każdy moduł zaczyna się domyślnie od import Prelude, wykonywany jest przed zdefiniowaniem funkcji. Jeden skrypt może importować kilka modułów – każda instrukcja importu zawarta jest w oddzielnej linii.

Moduły • Do importowania modułów w skryptach Haskella służy słowo import <nazwa modułu>. •

Moduły • Do importowania modułów w skryptach Haskella służy słowo import <nazwa modułu>. • Moduł musi zostać zdefiniowany przed użyciem jakiejkolwiek funkcji, którą on obsługuje. Zazwyczaj dokonuje się tego na samym początku pliku. • W jednym skrypcie można zaimportować więcej niż jeden moduł. Należy pamiętać jedynie o tym, aby każdy z modułów importować w oddzielnej linii.

Moduły • Moduł Data. List zawiera wiele przydatnych funkcji do pracy z listami, dzięki

Moduły • Moduł Data. List zawiera wiele przydatnych funkcji do pracy z listami, dzięki którym stworzyć można funkcje liczące unikatowe elementy w podanej przez siebie liście. import Data. List num. Uniques : : (Eq a) => [a] -> Int num. Uniques = length. nub • Po zaimportowaniu Data. List wszystkie funkcje w niej zawarte stają się dostępne w globalnej przestrzeni nazw, co oznacza, że możemy ich używać w dowolnym miejscu skryptu. • nub jest funkcją definiowaną przez Data. List, która pobiera listę i usuwa zduplikowane w niej elementy. • Zestawienie funkcji length i nub daje funkcję równoważną xs -> length (nub xs)

Moduły • Używając GHCI oraz chcąc korzystać z funkcji z modułu Data. List, musimy

Moduły • Używając GHCI oraz chcąc korzystać z funkcji z modułu Data. List, musimy dodać moduł do globalnej przestrzeni nazw w następujący sposób: ghci> : m + Data. List • Można również zaimportować wiele modułów jednocześnie: ghci> : m + Data. List Data. Map Data. Set • Jeśli wcześniej został zaimportowany moduł w skrypcie, to nie trzeba wykorzystywać : m + do importowania ich powtórnie.

Moduły • Jeżeli potrzebujemy wybranych funkcji z któregoś modułu, wystarczy zaimportować konkretny moduł, który

Moduły • Jeżeli potrzebujemy wybranych funkcji z któregoś modułu, wystarczy zaimportować konkretny moduł, który je posiada, podając ich nazwy: import Data. List (nub, sort) • Z kolei jeśli chcemy zaimportować wszystkie funkcje z modułu oprócz kilku wybranych, możemy użyć opcji hiding: import Data. List hiding (nub, sort)

Moduły • Do nazw możemy się też odwoływać, kwalifikując je nazwą modułu (zwane jako

Moduły • Do nazw możemy się też odwoływać, kwalifikując je nazwą modułu (zwane jako qualified import): import qualified Data. Map • Jeśli chcemy, żeby zaimportowane nazwy nie mieszały się z lokalnymi, możemy użyć import qualified: import qualified Data. Map as M import qualified Data. Vector as V import qualified Data. List as L import qualified Prelude as P Dzięki zastosowaniu tej formuły wiele funkcji można zapisać krócej: Data. Map. filter -> M. filter

Moduły – Data. List • Jest to moduł, który umożliwia operowanie na listach. •

Moduły – Data. List • Jest to moduł, który umożliwia operowanie na listach. • Zawiera on m. in. funkcje: interparse intercalate transpose concat and any/all or iterate split. At take. While/drop. While span break sort

Moduły – Data. List • Interparse – do każdego elementu listy dołącza znak wprowadzony

Moduły – Data. List • Interparse – do każdego elementu listy dołącza znak wprowadzony przez użytkownika: ghci> intersperse ’. ’ "SWAT" "S. W. A. T" ghci> intersperse 0 [1, 1, 1] [1, 0, 1] • Intercalate – działa podobnie do Interparse, najpierw pobiera element z listy, a następnie dołącza znak: ghci> intercalate " heh " ["ale", "jestem", "zadowolony"] " ale heh jestem heh zadowlony" ghci> intercalate [33, 33] [[7, 7], [5, 6], [2, 1]] [7, 7, 33, 5, 6, 33, 2, 1]

Moduły – Data. List • Transpose – zapisuje listę jako macierz: ghci> transpose [[1,

Moduły – Data. List • Transpose – zapisuje listę jako macierz: ghci> transpose [[1, 2, 3], [4, 5, 6], [7, 8, 9]] [[1, 4, 7], [2, 5, 8], [3, 6, 9]] • Concat – łączy elementy listy: ghci> concat [[1, 2, 3], [4, 5, 4], [3, 2, 1]] [1, 2, 3, 4, 5, 4, 3, 2, 1] • And – zwraca wartość logiczną dla elementów listy: ghci> and $ map (>2) [3, 4, 5, 6, 7, 8] True ghci> and $ map (==1) [1, 1, 0, 0, 1] False

Moduły – Data. Char • Jest to moduł, który obsługuje znaki. Obsługuje również stringi

Moduły – Data. Char • Jest to moduł, który obsługuje znaki. Obsługuje również stringi interpretując je jako listę znaków. • Zawiera m. in. funkcje: is. Control is. Space is. Lower is. Upper is. Alpha. Num is. Print digit. To. Int is. Oct. Digit is. Hex. Digit is. Letter is. Number is. Symbol

Moduły – Data. Char • Is. Alpha. Num - sprawdzamy czy znak jest literą/liczbą:

Moduły – Data. Char • Is. Alpha. Num - sprawdzamy czy znak jest literą/liczbą: ghci> all is. Alpha. Num "Robot 321" True ghci> all is. Alpha. Num "Robot 321" False • Digit. To. Int – zamiana litery na typ Integer: ghci> map digit. To. Int "34538" [3, 4, 5, 3, 8] ghci> map digit. To. Int "FF 85 AB" [15, 8, 5, 10, 11]

Moduły – Data. Char • Is. Alpha. Num - sprawdzamy czy znak jest literą/liczbą:

Moduły – Data. Char • Is. Alpha. Num - sprawdzamy czy znak jest literą/liczbą: ghci> all is. Alpha. Num "bobby 283" True ghci> all is. Alpha. Num "witaj bobby!" False • Digit. To. Int – zamiana wartości litery na typ Integer: ghci> map digit. To. Int "34538" [3, 4, 5, 3, 8] ghci> map digit. To. Int "FF 85 AB" [15, 8, 5, 10, 11] • Int. To. Digit – zamiana wartości litery na system szesnastkowy: ghci> int. To. Digit 5 ‘ 5’ ghci> int. To. Digit 14 ‘e’

Moduły – Data. Map • Jest to moduł, który umożliwia operowanie na tablicach list

Moduły – Data. Map • Jest to moduł, który umożliwia operowanie na tablicach list Association (asocjacyjnych – ”słowniki”). Zawiera m. in. Funkcje: Empty Insert from. List Size Singleton Member Map to. List Keys Elems

Moduły – Data. Map • Fromlist - przyjmuje listę i zwraca mapę z identycznymi

Moduły – Data. Map • Fromlist - przyjmuje listę i zwraca mapę z identycznymi asocjacjami. ghci> from. List [(1, 2), (3, 4), (3, 2), (5, 5)] from. List [(1, 2), (3, 2), (5, 5)] • Empty - zwraca pustą mapę. ghci > empty from. List [] • Size - zwraca rozmiar mapy ghci > size empty 0 ghci > size $ from. List [(2, 4), (3, 3), (4, 2), (5, 4), (6, 4)] 5

Moduły – Data. Map • to. List - zamienia mapę na listę ghci >

Moduły – Data. Map • to. List - zamienia mapę na listę ghci > to. List. insert 9 2 $ singleton 4 3 [(4, 3), (9, 2)] • Singleton - tworzy mapę z 1 elementem. Przyjmuje argumenty klucza i wartości. ghci > singleton 3 9 from. List [(3, 9)] ghci > insert 5 9 $ singleton 3 9 from. List [(3, 9), (5, 9)] • Member - sprawdza czy klucz należy do mapy. ghci > member 3 $ from. List [(3, 6), (4, 3), (6, 9)] True ghci > member 3 $ from. List [(2, 5), (4, 5)] False

Moduły – Data. Set • Jest to moduł, który jest typem pomiędzy listą a

Moduły – Data. Set • Jest to moduł, który jest typem pomiędzy listą a mapą. Wszystkie jego elementy są unikalne, operacje na setach są szybsze niż na listach. Nazwy funkcji z Data. Set są takie same jak w Data. List. Zawiera funkcje: Intersection Difference Subset

Moduły – Data. Set • Intersection - wypisuje wspólne elementy setów ghci > Set.

Moduły – Data. Set • Intersection - wypisuje wspólne elementy setów ghci > Set. intersection set 1 set 2 from. List " adefhilmnorstuy„ Aby wykorzystać tą funkcję, deklarujemy wcześniej oba sety: ghci> let set 1 = Set. from. List text 1 ghci> let set 2 = Set. from. List text 2 ghci> set 1 from. List ". ? AIRadefhijlmnorstuy" ghci> set 2 from. List " !Tabcdefghilmnorstuvwy" • Difference – pokazuje, które litery występują w jednym secie, a w drugim ich nie ma. ghci > Set. difference set 1 set 2 from. List ". ? AIRj" ghci > Set. difference set 2 set 1 from. List "!Tbcgvw" • Subset – służy do sprawdzania czy jeden set zawiera się w secie drugim. ghci > Set. from. List [2, 3, 4] `Set. is. Subset. Of ` Set. from. List [1, 2, 3, 4, 5] True

Funkcje wyższego rzędu. Moduły. Dziękujemy za uwagę.

Funkcje wyższego rzędu. Moduły. Dziękujemy za uwagę.