Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
1
Funkcje wyższego rzędu Moduły
Tomasz Adamowicz Anna Kostun
2
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.
3
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.
4
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ę.
5
Funkcje wyższego rzędu
Przykład sposobu definiowania funkcji: add :: Integer -> Integer -> Integer add :: Integer -> (Integer -> Integer) Przyjmuje ona parametr typu Integer oraz zwraca funkcję typu Integer, czyli przyjmuje i zwraca liczbę całkowitą.
6
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!"]
7
foldr funkcja element lista foldl funkcja element lista
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 funkcja element lista foldl (\x y -> 2*x + y) 4 [1,2,3] Czyli: (2 *(2 *(2 * 4 +1) +2) +3) foldr (\x y -> 2*x + y) 4 [1,2,3] Czyli: (2 * 1 +(2 * 2 +(2 * 3 + 4)))
8
zipWith funkcja lista1 lista2
Funkcja zipWith Funkcja ta wywołuje funkcję dla każdej pary elementów, która zwraca nową listę. zipWith funkcja lista1 lista2 let list1=[1,2,3,4] let list2=[5,6,7,8] let add a b = a+b zipWith add list1 list2 [6, 8, 10, 12] zipWith (>) ”aba” ”baba” [False,True,False]
9
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
10
Funkcje anonimowe λ (\x y -> x + y) zipWith (\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
11
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","bbbbbbbbbbbbb","cc"] ["bbbbbbbbbbbbb"]
12
Funkcje takeWhile, dropWhile
Funkcja takeWhile – wywołuje funkcję do każdego elementu listy i wyświetla jej wynik do momentu zwrócenia wartości False. takeWhile funkcja lista Funkcja dropWhile – wywołuje funkcję do każdego elementu listy i pomija je jeśli funkcja zwraca wartość True. dropWhile funkcja sekwencja
13
Funkcje takeWhile, dropWhile
takeWhile (/=‘m’) ”Ala ma kota” ”Ala” takeWhile (/= ’l’) ”Kot Ali” ”Kot A” dropWhile (/=‘k’) ”Ala ma kota” ”kota” dropWhile (/= ’l’) ”Kot Ali” "li"
14
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.
15
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.
16
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.
17
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 numUniques :: (Eq a) => [a] -> Int numUniques = 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)
18
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.
19
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)
20
Data.Map.filter -> M.filter
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
21
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 splitAt takeWhile/dropWhile span break sort
22
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,1] [1,0,1,0,1,0,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,33,5,6,33,33,2,1]
23
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
24
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: isControl isSpace isLower isUpper isAlphaNum isPrint digitToInt isOctDigit isHexDigit isLetter isNumber isSymbol
25
Moduły – Data.Char IsAlphaNum - sprawdzamy czy znak jest literą/liczbą: ghci> all isAlphaNum "Robot321" True ghci> all isAlphaNum "Robot 321" False DigitToInt – zamiana litery na typ Integer: ghci> map digitToInt "34538" [3,4,5,3,8] ghci> map digitToInt "FF85AB" [15,15,8,5,10,11]
26
Moduły – Data.Char IsAlphaNum - sprawdzamy czy znak jest literą/liczbą: ghci> all isAlphaNum "bobby283" True ghci> all isAlphaNum "witaj bobby!" False DigitToInt – zamiana wartości litery na typ Integer: ghci> map digitToInt "34538" [3,4,5,3,8] ghci> map digitToInt "FF85AB" [15,15,8,5,10,11] IntToDigit – zamiana wartości litery na system szesnastkowy: ghci> intToDigit 5 ‘5’ ghci> intToDigit 14 ‘e’
27
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 fromList Size Singleton Member Map toList Keys Elems
28
Moduły – Data.Map Fromlist - przyjmuje listę i zwraca mapę z identycznymi asocjacjami. ghci> fromList [(1,2),(3,4),(3,2),(5,5)] fromList [(1,2),(3,2),(5,5)] Empty - zwraca pustą mapę. ghci > empty fromList [] Size - zwraca rozmiar mapy ghci > size empty ghci > size $ fromList [(2,4),(3,3),(4,2),(5,4),(6,4)] 5
29
Moduły – Data.Map toList - zamienia mapę na listę
ghci > toList . 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 fromList [(3,9)] ghci > insert 5 9 $ singleton 3 9 fromList [(3,9),(5,9)] Member - sprawdza czy klucz należy do mapy. ghci > member 3 $ fromList [(3,6),(4,3),(6,9)] True ghci > member 3 $ fromList [(2,5),(4,5)] False
30
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
31
Moduły – Data.Set Intersection - wypisuje wspólne elementy setów
ghci > Set.intersection set1 set2 fromList " adefhilmnorstuy„ Aby wykorzystać tą funkcję, deklarujemy wcześniej oba sety: ghci> let set1 = Set.fromList text1 ghci> let set2 = Set.fromList text2 ghci> set1 fromList " .?AIRadefhijlmnorstuy" ghci> set2 fromList " !Tabcdefghilmnorstuvwy" Difference – pokazuje, które litery występują w jednym secie, a w drugim ich nie ma. ghci > Set.difference set1 set2 fromList ".?AIRj" ghci > Set.difference set2 set1 fromList "!Tbcgvw" Subset – służy do sprawdzania czy jeden set zawiera się w secie drugim. ghci > Set.fromList [2,3,4] `Set.isSubsetOf ` Set.fromList [1,2,3,4,5] True
32
Funkcje wyższego rzędu. Moduły.
Dziękujemy za uwagę.
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.