Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Haskell - Modules.

Podobne prezentacje


Prezentacja na temat: "Haskell - Modules."— Zapis prezentacji:

1 Haskell - Modules

2 Ładowanie modułów Załadowanie modułu: import <nazwa_modułu>
Przykładowo: import Data.List „ import Data.List hiding (nub) Now, to reference Data.Map's filter function, we just use M.filter.  ”

3 Data.List Intersperse dostaje znak oraz listę, a następnie umieszcza znak pomiędzy każdą parą elementów na liście. ghci > intersperse ’.’ " MONKEY " "M.O.N.K.E.Y" ghci > intersperse 0 [1 ,2 ,3 ,4 ,5 ,6] [1 ,0 ,2 ,0 ,3 ,0 ,4 ,0 ,5 ,0 ,6] Intercalate ghci > intercalate " " [" hey "," there "," guys "] " hey there guys " ghci > intercalate [0 ,0 ,0] [[1 ,2 ,3] ,[4 ,5 ,6] ,[7 ,8 ,9]] [1 ,2 ,3 ,0 ,0 ,0 ,4 ,5 ,6 ,0 ,0 ,0 ,7 ,8 ,9]

4 W przypadku kiedy chcemy użyć jedynie wybranych funkcji z modułu możemy użyć:
import Data.List (nub, sort) Spowoduje to dostępność funkcji nub i sort w globalnej przestrzeni nazw. Inną możliwością jest wykluczenie określonych funkcji: import Data.List hiding (nub) W tym przypadku funkcja „nub” nie będzie dostępna.

5 Transpose transponuje listę list
Transpose transponuje listę list. Traktując listy jako macierz kolumny staną się wierszami i odwrotnie. ghci > transpose [[1 ,2 ,3] ,[4 ,5 ,6] ,[7 ,8 ,9]] [[1 ,4 ,7] ,[2 ,5 ,8] ,[3 ,6 ,9]] ghci > transpose [" hey "," there "," guys "] [" htg "," ehu "," yey ","rs","e"]

6 Funkcja concat pozwala na zamianę elementów listy na jedną listą łącząc pojedyncze elementy oraz na zamianę listy list na pojedynczą listę. ghci> concat ["foo","bar","car"]   "foobarcar"   ghci> concat [[3,4,5],[2,3,4],[2,1,1]]   [3,4,5,2,3,4,2,1,1]   Funkcja and sprawdza listę pod kątem podanego warunku. ghci> and (map (>4) [5,6,7,8]) True  

7 Funkcja OR ma działanie zbliżone do funkcji and
Funkcja OR ma działanie zbliżone do funkcji and. Funkcja zwraca wartości false lub true. Jeżeli w liście znajduje się przynajmniej jeden element pasujący do warunku funkcja zwróci true. Zamiast or i and w połączniu z map można użyć odpowiednio any i all: ghci > any (==4) [2,3,5,6,1,4] True ghci > all (>4) [6,9,10]

8 Funkcja iterate przyjmuje jako argument funkcję i wartość startową, następnie wykonuje się ponownie dla otrzymanego poprzednio rezultatu określoną ilość razy. ghci > take 10 $ iterate (*2) 1 [1,2,4,8,16,32,64,128,256,512] ghci > take 3 $ iterate (++ "haha") "haha" ["haha","hahahaha","hahahahahaha"]

9 Funkcja splitAt dostaje jako argument wartość liczbową oraz listę
Funkcja splitAt dostaje jako argument wartość liczbową oraz listę. Lista wejściowa zostanie podzielona wg. arumentu na dwie listy które otrzymamy na wyjściu. ghci> splitAt 3 "heyman"   ("hey","man")   ghci> splitAt 100 "heyman"   ("heyman","")  

10 takeWhile na wejściu pobiera listę oraz parametr wg
takeWhile na wejściu pobiera listę oraz parametr wg. którego zostanie przesiana lista. ghci> takeWhile (>3) [6,5,4,3,2,1,2,3,4,5, 4,3,2,1]   [6,5,4]  ghci> dropWhile (<3) [1,2,2,2,3,4,5,4,3,2, 1]   [3,4,5,4,3,2,1]  

11 sort – sortuje listę e ghci > sort [8,5,3,2,1,6,4,2] [1,2,2,3,4,5,6,8] ghci > sort "This will be sorted  soon" " Tbdeehiillnooorssstw” Funkcja group grupuje elementy listy wejściowej pod względem ich równości. ghci> group [1,1,1,1,2,2,2,2,3,3,2,2,2,5,6,7 ]   [[1,1,1,1],[2,2,2,2],[3,3],[2,2,2],[5],[6],[7]]   

12 Funkcja isInfixOf wyszukuje w liście podanej jako parametr frazy dając na wyjściu wartość true lub false. ghci> "cat" `isInfixOf` "im a cat burglar"   True   ghci> [2,2] `isPrefixOf` [2,1,2]    ghci> "there!" `isSuffixOf` "oh hey there! “ Funkcja elemIndex zwraca index podanego jako parametr elementu listy. ghci> 4 `elemIndex` [1,2,3,4,5,6]   Just 3  

13 elemIndices działa na zasadzie podobnej do poprzedniej funkcji jednak na wyjściu otrzymujemy indeksy wszystkich wystąpień podanego argumentu. ghci> ' ' `elemIndices` "Where are the sp aces?"   [5,9,13]    findIndex funkcja zwraca indeks pierwszego elementu pasującego do wzorca. ghci> findIndex (==4) [5,3,2,1,6,4]   Just 5  

14 lines jest funkcją dzielącą stringa pod kątem znaku '\n' dając na wyjściu listę z podzielonym stringiem. ghci> lines "first line\nsecond line\nthird l ine"   ["first line","second line","third line"]   unlines jest odwrotnością działania funkcji lines. ghci> unlines ["first line", "second line", "t hird line"]   "first line\nsecond line\nthird line\n" 

15 words oraz unwords są to funkcje rozbijające stringa na pojedyczne elementy listy oraz składające z elementów listy pojedynczego stringa. ghci> words "hey these are the words in  this sentence"   ["hey","these","are","the","words","in","thi s","sentence"]   ghci> unwords ["hey","there","mate"]   "hey there mate"  

16 Funkcja nub usuwa z listy/stringa elementy/znaki powtarzające się.
ghci> nub [1,2,3,4,3,2,1,2,3,4,3,2,1]   [1,2,3,4]   ghci> nub "Lots of words and stuff"   "Lots fwrdanu"   Funkcja delete usuwa z listy pierwszy napotkany element odpowiadający wzorcowi. ghci> delete 'h' "hey there ghang!"   "ey there ghang!"  

17 ‘\\’ jest funkcją usuwającą z listy elementy podane jako parametr.
ghci> [1..10] \\ [2,5,9]   [1,3,4,6,7,8,10] ghci> "Im a big baby" \\ "big"   "Im a  baby„ Intersect jest funkcją zwracającą część wspólną podanych list. ghci> [1..7] `intersect` [5..10]   [5,6,7]  

18 Insert to funkcja wstawiająca wartość do posortowanej listy.
ghci> insert 4 [1,2,3,5,6,7]   [1,2,3,4,5,6,7] 

19 Data.Char Moduł Data.Char zawiera funkcje do operowania na pojedynczych znakach np.: IsAlphaNum zwraca True jeśli argument jest znakiem alfanumerycznym lub False w przeciwnym przypadku: ghci > all isAlphaNum "bobby283" True ghci > all isAlphaNum "eddy the fish!" False

20 toUpper konwertuje znak na znak przekszatcając go na dużą literę.
toLower  toTitle converts a character to title-case. For most characters, title-case is the same as upper-case. digitToInt converts a character to an Int. To succeed, the character must be in the ranges '0'..'9', 'a'..'f' or 'A'..'F'.

21 digitToInt konwertuje znak na Int, znak musi być z zakresu '0'
digitToInt konwertuje znak na Int, znak musi być z zakresu '0'..'9', 'a'..'f' lub ‘A..Z’ ghci> map digitToInt "34538"   [3,4,5,3,8]   ghci> map digitToInt "FF85AB"   [15,15,8,5,10,11]   intToDigit przyjmuje inta z zakresu 0..15 ghci> intToDigit 15   'f'  

22 Ord i chr przyporządkowywują znakowi jego wartość kodu ascii i odwrotnie.
ghci> ord 'a'   97   ghci> chr 97   'a'   ghci> map ord "abcdefgh"   [97,98,99,100,101,102,103,104]

23 Data.Map Moduł Data.Map dostarcza funkcje umożliwiające przeprowadzanie operacji na tablicach asocjacyjnych. import qualified Data.Map as Map 

24 Funkcja empty reprezentuje pustą mapę
Funkcja empty reprezentuje pustą mapę. Nie przyjmuje argumentów, zwraca jedynie pustą mapę. ghci> Map.empty   Funkcja insert na wejściu dostaje klucz, wartość oraz mapę, na wyjściu otrzymujemy mapę wynikową. ghci> Map.insert 5 600 (Map.insert 4 200 ( Map. insert 3 100  Map.empty))  

25 Funkcja null sprawdza czy lista jest pusta, na wyjściu dostajemy True lub False.
ghci> Map.null Map.empty   True   ghci> Map.null $ Map.fromList [(2,3),(5,5)] False   Funkcja size informuje o rozmiarze mapy. ghci> Map.size Map.empty   0   ghci> Map.size $ Map.fromList [(2,4),(3,3),(4, 2),(5,4),(6,4)]   5  

26 Funkcja member przyjmuje klucz oraz mapę, na wyjściu daje wartość true lub false w zależności czy klucz znajduje się w mapie. ghci> Map.member 3 $ Map.fromList [(3, 6),(4,3),(6,9)]  

27 Data.Set import qualified Data.Set as Set  

28 text1 = "I just had an anime dream. Anime. Reality
text1 = "I just had an anime dream. Anime. .. Reality... Are they so different?"   text2 = "The old man left his garbage can  out and now his trash is all over my lawn!"    Funkcja fromList przyjmuje listę i konwertuje ja na strukturę set. ghci> let set1 = Set.fromList text1   ghci> let set2 = Set.fromList text2   ghci> set1   fromList " .?AIRadefhijlmnorstuy"  

29 Funkcja intersection przyjmuje na wejściu dwie struktury i zwraca ich część wspólną.
ghci> Set.intersection set1 set2   fromList " adefhilmnorstuy"   Funkcja difference wskazuje zawartość która znajduje się w pierwszej strukturze a nie ma jej w drugiej. ghci> Set.difference set1 set2   fromList ".?AIRj" 

30 Tworzenie własnych modułów
Karolina Szymańska

31 W Haskellu ,tak jak w innych językach programowania, możemy definiować własne funkcję i umieszczać je w utworzonych przez siebie modułach.

32 Nazwa modułu musi rozpoczynać się od wielkiej litery
Każdy plik zawiera tylko jeden moduł Nazwa pliku powinna być taka sama jak nazwa modułu , dodajemy rozszerzenie .hs

33 module YourModule where
Nagłówek modułu module YourModule where

34 Po nazwie modułu możemy zaznaczyć, które z funkcji będą eksportowane, czyli te których będzie mógł używać program importujący nasz moduł.

35 Importowanie Import naszego modułu wygląda tak samo jak w przypadku importowania wbudowanych .

36 Podmoduły Każdy moduł może posiadać swoje pod moduły
Każdy pod moduł znajduje się w osobnym pliku Wszystkie pliki zawierające pod moduły powinny znajdować się w folderze o nazwie takiej jak moduł nadrzędny

37 module YourModule.Submodule where
Nagłówek module YourModule.Submodule where

38 Hierarchia

39 Własne typy danych

40 Algebraiczne typy danych
Słowo kluczowe data oznacza, że będziemy definiować nowy typ danych. Po tym słowie znajduje się nazwa typu . Po znaku = definiujemy tzw. konstruktor wartości, czyli jakie wartości może przyjmować nasz typ.

41 Pierwsza i ostatnia wartość konstruktora to odpowiednio wartość minimalna i maksymalna typu. Nie jest to faktyczna definicja typu Int .

42 Nasz typ Shape może być kołem bądź prostokątem .
Możemy zdefiniować funkcję surface obliczającą powierzchnie dla koła bądź prostokąta .

43 Przy wywołaniu funkcji surface musimy użyć $ , gdyż najpierw musi wykonać się prawa strona wyrażenia .

44 Wyświetlanie By móc wyświetlać swój typ musimy w definicji użyć słowa kluczowego deriving . Wszystkie funkcje , które dodamy za słowem deriving będą automatycznie generowane dla naszego typu. Do wyświetlania służy funkcja Show

45 W swoim typie możemy stosować inne typy danych , które także stworzyliśmy .

46 Eksportowanie Możemy eksportować nasze typy i funkcje z nim związane do modułu Tak może wyglądać nagłówek modułu zawierający nasze typy . Zapisz Shape (..) oznacza tyle, że eksportujemy również konstruktor wartości dla typu Shape. Możemy również nie eksportować go w ogóle.

47 Rekordy Jednym z dobrych przykładów takie typu danych jest rekord reprezentujący osobę, gdzie pola będą to kolejno imię, nazwisko, wiek, wzrost, numer telefonu oraz ulubiony smak.

48 Funkcje – pola rekordów
Możemy definiować funkcję, które będą zwracać pojedyncze pola rekordu, czyli tylko niektóre informacje o osobie.

49 Alternatywny zapis danych
Używając nawiasów klamrowych zapisujemy nazwę pola a po znaku :: jego typ. Przy użyciu takiego zapisu otrzymamy wektor sześcioelementowy

50 Parametry typu Konstruktor wartości może otrzymywać parametry

51 Instancje pochodne (derived instances)
Typ w Haskellu może być instancją jakiegoś typu klasowego, który definiują pewne zachowania i typ je po nim „przejmuje”. Np. typ Int jest instancją typu klasowego Eq , czyli możemy porównać ze sobą dwie liczby typu Int. Typy klasowe możemy porównać do interfejsów.

52 Do naszego typu możemy dołączać wiele różnych typów klasowych , np
Do naszego typu możemy dołączać wiele różnych typów klasowych , np. (Eq, Show, Read). Show konwertuje nasz typ na String Read konwertuje String na nasz typ

53 Typ wyliczeniowy Za pomocą typów algebraicznych możemy tworzyć typy wyliczeniowe. Tutaj możemy użyć takich typów klasowych jak Enum ( poprzednik i nastęnik) oraz Bounded ( najwyższa i najniższa wartość).

54 Synonimy typów Są to inne nazwy dla danego typu, które są równoważne.
Oto jak biblioteka standardowa definiuje String jako synonim dla [Char]. Za pomocą słowa kluczowego type nie tworzymy nowego typu danych lecz definiujemy synonim już istniejącego typu.

55 Przykład Gdy stworzymy funkcję, która zamienia wszystkie znaki w tekście na wielkie i nazwiemy ją np. toUpperString to nasza deklaracja mogłaby wyglądać w następujący sposób: toUpperString :: [Char] -> [Char] Bądź toUpperString :: String -> String

56 Typeclasses 102 Michał Parteka

57 Typeclasses 102 - Klasy typów & instancje
Typeclasses defines behaviours like i.e. comparing for equality, comparing for ordering etc. - Klasy typów definiują zachowania jak np. porównywanie pod równość, pod stopniowanie itp. Types which behave like i.e. equality, ordering are instances of that typeclasses. - Typy które zachowują się jak np. równość, stopniowanie są instancjami pewnej klasy typów So, if type is an instance of typeclass, it means we can use the functions that the typeclass defines with that type. - A więc jeżeli typ jest instancją klasy typów, to oznacza że możemy użyć funkcji które ta klasa typu definiuje w odniesieniu do tego typu.

58 Przykład Eq class in standard prelude The a
is the type variable and it means that a will play the role of the type. - “a” jest zmienną typu i to oznacza że “a” będzie grać rolę typu.

59 Przykład Tworzenie instancji When we’re making an instance, we write
instance Eq TrafficLight where. We replace the a with the actual type. Kiedy tworzymy instancje, używamy słowa kluczowego “instance” w tym przypadku “instance Eq TrafficLight where”. Zamieniamy zmienną “a” na aktualny typ.

60 Typeclasses 102 class is for defining new typeclasses - Słówko “class” służy do definiowania nowych klas typów. instance is for making our types instances of typeclasses. - Słówko “instance” służy do tworzenia naszych instancji typów w obrębie danej klasy typu.

61 Przykład A yes-no typeclass

62 A yes-no typeclasses In JavaScript and some other weakly typed languages, you can put almost anything inside an if expression. For example, you can do all of the following: if (0) alert("YEAH!") else alert("NO!"), if ("") alert ("YEAH!") else alert("NO!"),if (false) alert("YEAH") else alert("NO!), etc. and all of these will throw an alert of NO!. If you do if ("WHAT") alert ("YEAH") else alert("NO!"), it will alert a "YEAH!" because JavaScript considers non-empty strings to be a sort of true-ish value.

63 function yesNo () { if (0) { console.log("YEAH!"); } else { console.log("NO!"); }; if ("") { } if (false) {

64 Example Making same behaviour in Haskell
class declaration -> defining some instances -> test id - standard library function that takes a parameter and returns the same thing.

65 If statement mimics It takes a yes-no-ish value and two things. If
the yes-no-ish value is more of a yes, it returns the first of the two things, otherwise it returns the second of them.

66 The Functor typeclass - Klasa typu “functor”

67 The Functor typeclass Is basically for things that can be mapped over. - Służy do “rzeczy” które mogą być zmapowane (iterowane) The list type is part of Functor typeclass. - Typ “list” jest częścią klasy typów “functor” fmap takes a function from one type to another, and a functor applied with one type, and returns a functor applied with another type. - fmap pobiera funkcję z jednego typu do drugiego oraz functor zaaplikowany z jednym typem, i zwraca functor zaaplikowany do kolejnego typu.

68 Similarity to map map is just a fmap that works only on lists. -
map to po prostu fmap który działa wyłącznie na listach.

69 maybe example Maybe - Haskell Algebraic Data Type which extends a type, such as Integer, into a new context in which it has an extra value (Nothing) that represents a lack of value. The type system then requires that you check for that extra value before it will let you get at the Integer that might be there. This prevents a remarkable number of bugs.

70 in a Just, then we apply the function on the contents of the Just.
maybe example If it’s an empty value of Nothing, then just return a Nothing. If we map over an empty box, we get an empty box. If it’s not an empty value, but rather a single value packed up in a Just, then we apply the function on the contents of the Just.


Pobierz ppt "Haskell - Modules."

Podobne prezentacje


Reklamy Google