Moduły. Źródło: a) Wczytywanie modułów. interparse rozdziela każdy element listy wcześniej podanym znakiem

Podobne dokumenty
Haskell Moduły Ładowanie

Moduł to zbiór powiązanych ze sobą funkcji, typów i klas typu. Język Haskell stanowi zbiór modułów, gdzie moduł główny załącza pozostałe moduły w

HASKELL. Higher order functions, Modules. Janusz Bugajny Piotr Rogulski Łukasz Antoszkiewicz

Języki programowania Haskell

- nawiasy kwadratowe oznaczają, że to lista

Zasady programowania Dokumentacja

Bash - wprowadzenie. Bash - wprowadzenie 1/39

Dr Michał Tanaś(

WEJŚCIE/WYJŚCIE HASKELL ŁUKASZ PAWLAK DARIUSZ KRYSIAK

Algorytmy i struktury danych

Elementy języka Haskell

opisuje nazwy kolumn, wyrażenia arytmetyczne, funkcje nazwy tabel lub widoków warunek (wybieranie wierszy)

Wykład 5. SQL praca z tabelami 2

Python wprowadzenie. Warszawa, 24 marca PROGRAMOWANIE I SZKOLENIA

Tabela wewnętrzna - definicja

77. Modelowanie bazy danych rodzaje połączeń relacyjnych, pojęcie klucza obcego.

- język zapytań służący do zapisywania wyrażeń relacji, modyfikacji relacji, tworzenia relacji

Bazy danych. Plan wykładu. Zależności funkcyjne. Wykład 2: Relacyjny model danych - zależności funkcyjne. Podstawy SQL.

Zatem w jaki sposób nasze programy mają komunikować się ze światem zewnętrznym?

Wprowadzenie do baz danych

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].

REKURENCJA W JĘZYKU HASKELL. Autor: Walczak Michał

1 Podstawy c++ w pigułce.

Krzysztof Kadowski. PL-E3579, PL-EA0312,

Podstawy Programowania C++

Bazy danych. Polecenia SQL

SQL, LIKE, IN, CASE, EXISTS. Marcin Orchel

Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Podstawy języka SQL. SQL Structured Query Languagestrukturalny

Informatyka 1. Plan dzisiejszych zajęć. zajęcia nr 11. Elektrotechnika, semestr II rok akademicki 2008/2009

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

PARADYGMATY I JĘZYKI PROGRAMOWANIA. Haskell. (w11)

Oracle PL/SQL. Paweł Rajba.

PL/SQL. Funkcje wbudowane

Podstawowe zapytania SELECT (na jednej tabeli)

Podstawy Programowania Podstawowa składnia języka C++

Technologie baz danych

Przykłady zastosowań funkcji tekstowych w arkuszu kalkulacyjnym

Relacyjne bazy danych. Podstawy SQL

Nazwa implementacji: Nauka języka Python wyrażenia warunkowe. Autor: Piotr Fiorek. Opis implementacji: Poznanie wyrażeń warunkowych if elif - else.

Bazy danych. Bazy danych. Podstawy języka SQL. Dr inż. Paweł Kasprowski.

Podstawy programowania. Podstawy C# Tablice

Programowanie i struktury danych

Wstęp do Programowania potok funkcyjny

Składnia funkcji i Rekurencja w języku Haskell

CREATE DATABASE ksiegarnia_internetowa DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

1. Tworzenie tabeli. 2. Umieszczanie danych w tabeli

lekcja 8a Gry komputerowe MasterMind

Algorytmika i Programowanie VBA 1 - podstawy

Ćwiczenie 7 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Definicje wyższego poziomu

Podstawy programowania skrót z wykładów:

Inicjacja tablicy jednowymiarowej

Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 8

Informatyka 1. Przetwarzanie tekstów

Programowanie w języku Java. Kolekcje

Systemy GIS Tworzenie zapytań w bazach danych

PRZESTRZENNE BAZY DANYCH WYKŁAD 2

Program współpracuje z : Windows XP, Powerdraft 2004, v8, XM, Microstation 2004, v8, XM.

Wykład 4. SQL praca z tabelami 1

4. Funkcje. Przykłady

Podstawy programowania

INSTRUKCJA PUSTA. Nie składa się z żadnych znaków i symboli, niczego nie robi. for i := 1 to 10 do {tu nic nie ma};

Myśl w języku Python! : nauka programowania / Allen B. Downey. Gliwice, cop Spis treści

Relacyjne bazy danych. Podstawy SQL

Bazy danych Access KWERENDY

Podstawy Programowania

Wstęp 5 Rozdział 1. Podstawy relacyjnych baz danych 9

Kod składa się z kodu głównego oraz z odpowiednich kodów dodatkowych (akcesoriów). Do kodu można przyłączyć maksymalnie 9 kodów dodatkowych.

Linux Polecenia. Problem nadpisywania plików. Zmienna noclobber i noglob. Filtry i metaznaki. Problem nadpisywania plików. Opracował: Andrzej Nowak

Wykład 7 Abstrakcyjne typy danych słownik (lista symboli)

1 Podstawy c++ w pigułce.

INFORMATYKA Studia Niestacjonarne Elektrotechnika

Przykłady najlepiej wykonywać od razu na bazie i eksperymentować z nimi.

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

KORPORACYJNE SYSTEMY ZARZĄDZANIA INFORMACJĄ

Rozpoczynamy import Kreator uruchamiamy przyciskiem Z tekstu, znajdującym się na karcie Dane, w grupie Dane zewnętrzne.

INFORMATYKA GEODEZYJNO- KARTOGRAFICZNA Relacyjny model danych. Relacyjny model danych Struktury danych Operacje Oganiczenia integralnościowe

Rozwiązanie. Uruchom program Access 2007.

Podstawy programowania w języku C i C++

Serwer WWW Apache. Plik konfiguracyjny httpd.conf Definiujemy m.in.: Aktualne wersje 2.4.6, , zakończony projekt

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

Język SQL, zajęcia nr 1

Podstawowe algorytmy i ich implementacje w C. Wykład 9

Oracle PL/SQL. Paweł Rajba.

Algorytmy i struktury danych. Wykład 6 Tablice rozproszone cz. 2

INŻYNIERIA BEZPIECZEŃSTWA LABORATORIUM NR 2 ALGORYTM XOR ŁAMANIE ALGORYTMU XOR

Bazy danych - wykład wstępny

Kontenery i iteratory. Wykorzystanie kontenerów w praktyce.

Listy, krotki, słowniki, funkcje

Algorytmy i. Wykład 3: Stosy, kolejki i listy. Dr inż. Paweł Kasprowski. FIFO First In First Out (kolejka) LIFO Last In First Out (stos)

BASH - WPROWADZENIE Bioinformatyka 4

SAS Podstawowe informacje przed ćwiczeniem 2

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

Laboratorium nr 4. Temat: SQL część II. Polecenia DML

Algorytmy sortujące i wyszukujące

Funkcje wbudowane PHP

BASH - LINIA POLECEŃ. Bioinformatyka 2018/2019

Transkrypt:

Autor: Roman Gęsiarz Moduły Źródło: http://learnyouahaskell.com/modules a) Wczytywanie modułów b) Data.List c) Data.Char d) Data.Map e) Data.Set f) Tworzenie własnych modułów Łódź, dnia 25.03.2017 r. Ad. a) Wczytywanie modułów W Haskellu moduły możemy wczytać na dwa sposoby: - poziom skryptowy import Data.List numuniques :: (Eq a) => [a] -> Int numuniques = length. nub - poziom GHCI ghci> :m + Data.List ghci> :m + Data.List Data.Map Data.Set Ad. b) Data.List Moduł Data.List zapewnia dodatkowe funkcje do obsługi list interparse rozdziela każdy element listy wcześniej podanym znakiem 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 pobiera elementy listy i oddziela je podanym znakiem 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] Strona 1 z 9

transpose patrząc na liste jak na macierz wypisuje w oddzielnych listach kolumny tej macierzy 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"] concat łączy ze sobą elementy z listy 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] and pobiera wartość logiczną i zwraca wartość logiczną tylko wtedy kiedy lista spełnia pobraną wartość logiczną ghci> and $ map (>4) [5,6,7,8] ghci> and $ map (==4) [4,4,4,3,4] any i all biorą predykat a następnie sprawdzają go z listą ghci> any (==4) [2,3,5,6,1,4] ghci> all (>4) [6,9,10] ghci> all (`elem` ['A'..'Z']) "HEYGUYSwhatsup" ghci> any (`elem` ['A'..'Z']) "HEYGUYSwhatsup" or pobiera wartość logiczną i zwraca wartość logiczną tylko wtedy kiedy lista spełnia pobraną wartość logiczną ghci> or $ map (==4) [2,3,4,5,6,1] ghci> or $ map (>4) [1,2,3] iterate wykonuje iteracje wcześniej wskazaną ilość razy ghci> take 10 $ iterate (*2) 1 [1,2,4,8,16,32,64,128,256,512] ghci> take 3 $ iterate (++ "haha") "haha" Strona 2 z 9

["haha","hahahaha","hahahahahaha"] splitat pobiera liczbę i listę a następnie dzieli listę w tym elemencie i podaje ją w krotce ghci> splitat 3 "heyman" ("hey","man") ghci> splitat 100 "heyman" ("heyman","") ghci> splitat (-3) "heyman" ("","heyman") ghci> let (a,b) = splitat 3 "foobar" in b ++ a "barfoo" takewhile/dropwhile pobiera wartość i listę, a następnie przeszukuje listę aż znajdzie daną wartość i odcina z listy wszystko co znajduje się za/przed elementem ghci> takewhile (>3) [6,5,4,3,2,1,2,3,4,5,4,3,2,1] [6,5,4] ghci> takewhile (/=' ') "This is a sentence" "This" ghci> dropwhile (/=' ') "This is a sentence" " is a sentence" ghci> dropwhile (<3) [1,2,2,2,3,4,5,4,3,2,1] [3,4,5,4,3,2,1] span działa podobnie do takewhile, ale wyświetla oba elementy listy ghci> let (fw, rest) = span (/=' ') "This is a sentence" in "First word:" ++ fw ++ ", the rest:" ++ rest "First word: This, the rest: is a sentence" break działa podobnie do span ghci> break (==4) [1,2,3,4,5,6,7] ([1,2,3],[4,5,6,7]) ghci> span (/=4) [1,2,3,4,5,6,7] ([1,2,3],[4,5,6,7]) sort sortuje elementy listy 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" Strona 3 z 9

group grupuje takie same elementy listy w oddzielne listy 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]] inits and tails to standardowy początek i koniec listy tylko wykonywany rekurencyjnie aż do końca listy ghci> inits "w00t" ["","w","w0","w00","w00t"] ghci> tails "w00t" ["w00t","00t","0t","t",""] ghci> let w = "w00t" in zip (inits w) (tails w) [("","w00t"),("w","00t"),("w0","0t"),("w00","t"),("w00t","")] isinfixof przeszukuje listę i zwraca wartość logiczna jeśli znajdzie podany element ghci> "cat" `isinfixof` "im a cat burglar" ghci> "Cat" `isinfixof` "im a cat burglar" ghci> "cats" `isinfixof` "im a cat burglar" isprefixof /issuffixof sprawdza czy dany element jest na początku/końcu listy ghci> "hey" `isprefixof` "hey there!" ghci> "hey" `isprefixof` "oh hey there!" ghci> "there!" `issuffixof` "oh hey there!" ghci> "there!" `issuffixof` "oh hey there" Ad. c) Data.Char Moduł ten eksportuje dodatkowe funkcje działające na Char ach. Jest on również pomocny w mapowaniu i filtrowaniu stringów. iscontrol sprawdza czy znak jest znakiem kontrolnym isspace sprawdza czy w ciągu znaków występuje spacja, tabulator, znak nowej linii, itp. islower/isupper sprawdza czy znak jest małą/dużą literą isalpha sprawdza czy znak jest literą isalphanum sprawdza czy znak jest l literą lub liczbą Strona 4 z 9

isdigit/isoctdigit/ishexdigit sprawdza czy znak jest cyfrą/postaci binarnej/postaci heksadecymalnej isnumber sprawdza czy znak jest numeryczny. issymbol sprawdza czy znak jest symbolem matematycznym lub walutowym toupper zmienia znak na dużą literę tolower zamienia znak na małą literą ord zamienia znak na cyfrę jemu odpowiadającą i odwrotnie ghci> ord 'a' 97 ghci> chr 97 'a' ghci> map ord "abcdefgh" [97,98,99,100,101,102,103,104] Ad. d) Data.Map Data.Map lista asocjacji nazywana też słownikiem. Służy do przechowywania par kluczy i wartości. Dla przykładu utwórzmy książkę telefoniczną używając listy asocjacji gdzie numer będzie wartością a imię kluczem: phonebook = [("betty","555-2938"),("bonnie","452-2928"),("patsy","493-2928"),("lucille","205-2928"),("wendy","939-8282"),("penny","853-2492") ] W liście asocjacji 1. element pary zawsze jest kluczem a 2. wartością. Najczęstszym zadaniem gdy mamy do czynienie z listami asocjacji jest wyszukiwanie wartości według podanego klucza. findkey :: (Eq k) => k -> [(k,v)] -> v findkey key xs = snd. head. filter (\(k,v) -> key == k) $ xs Funkcja przyjmuje klucz i listę. Lista jest filtrowana tak, aby pozostały tylko pary z pasującymi kluczami. Następnie jest wybierana 1 para a z niej poszukiwana wartość. Jeśli poszukiwany klucz nie istnieje zostanie zwrócony wyjątek: Exception: Prelude.head: empty list. Można tego uniknąć przez użycie typu danych Maybe. Jeśli nie znajdziemy klucza funkcja zwróci Nothing w przeciwnym przypadku zostanie zwrócona wartość pasująca do tego klucza. findkey :: (Eq k) => k -> [(k,v)] -> Maybe v findkey key [] = Nothing findkey key ((k,v):xs) = if key == k then Just v else findkey key xs Strona 5 z 9

ghci> findkey "penny" phonebook Just "853-2492" ghci> findkey "betty" phonebook Just "555-2938" ghci> findkey "wilma" phonebook Nothing Ponieważ Data.Map importuje funkcje, które kolidują z Data.List trzeba zrobić qualifed import: import qualified Data.Map as Map Funkcje zawarte w Data.Map Fromlist - przyjmuje listę asocjacji i zwraca mapę z tymi samymi asocjacjami. ghci> Map.fromList [(1,2),(3,4),(3,2),(5,5)] fromlist [(1,2),(3,2),(5,5)] Jeśli w którymś miejscu istnieją takie same klucze to wszelkie duplikaty są usuwane. Definicja funkcji fromlist: Map.fromList :: (Ord k) => [(k, v)] -> Map.Map k v Należy zauważyć że gdy robiliśmy listę asocjacji przy pomocy normalnej listy to klucze musiały być porównywalne (musiały należeć do klasy Eq). Przy użyciu mapy klucze muszą być Orderable żeby można je było umieścić na drzewie. Empty - Zwraca pusta mapę. ghci > Map.empty fromlist [] Insert - Przyjmowane wartości to klucz wartość i mapa. Funkcja wstawia podany klucz i wartość do mapy. ghci > Map.insert 3 100 Map.empty fromlist [(3,100)] Null - Sprawdza czy mapa jest pusta ghci > Map.null Map.empty ghci > Map.null $ Map.fromList [(2,3),(5,5)] Strona 6 z 9

Size - Zwraca rozmiar mapy ghci > Map.size Map.empty 0 ghci > Map.size $ Map.fromList [(2,4),(3,3),(4,2),(5,4),(6,4)] 5 Singleton - Tworzy mapę z 1 elementem. Przyjmowane argumenty to klucz i wartość. ghci > Map.singleton 3 9 fromlist [(3,9)] ghci > Map.insert 5 9 $ Map.singleton 3 9 fromlist [(3,9),(5,9)] Member - Sprawdza czy podany klucz należy do mapy. ghci > Map.member 3 $ Map.fromList [(3,6),(4,3),(6,9)] ghci > Map.member 3 $ Map.fromList [(2,5),(4,5)] Map - Działa tak samo jak funkcje z Data.List tylko operują na mapach ghci > Map.map (*100) $ Map.fromList [(1,1),(2,4),(3,9)] fromlist [(1,100),(2,400),(3,900)] tolist - Jest przeciwnością fromlist czyli zamienia mapę na listę ghci > Map.toList. Map.insert 9 2 $ Map.singleton 4 3 [(4,3),(9,2)] Keys - Zwraca klucze z mapy Map.keys $ Map.fromList [(3,6),(4,3),(6,9)] [3,4,6] Elems - Zwraca wartości z mapy Map.elems $ Map.fromList [(3,6),(4,3),(6,9)] [6,3,9] Ad. e) Data.Set Sety są typem pomiędzy listami a mapami. Wszystkie jego elementy są unikalne i muszą należeć do klasy orderable. Operacje na setach są szybsze niż na listach. Ponieważ nazwy funkcji z Data.Set są takie same jak w Data.List trzeba zrobić qualifed import: Strona 7 z 9

import qualified Data.Set as Set Jeśli mamy 2 teksty i chcemy sprawdzić jakie litery zostały w nich użyte można do tego wykorzystać Data.Set. 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!" ghci > let set1 = Set.fromList text1 ghci > let set2 = Set.fromList text2 ghci > set1 fromlist ".?AIRadefhijlmnorstuy" ghci > set2 fromlist "!Tabcdefghilmnorstuvwy" Funkcja fromlist przekonwertowała tekst na set. Elementy są unikalne oraz są ustawione w kolejności rosnącej. Intersection - Funkcja wypisuje elementy wspólne setów ghci > Set.intersection set1 set2 fromlist " adefhilmnorstuy" Difference - Funkcja pokazuje które litery występują w 1 secie a których nie ma w 2 secie. ghci > Set.difference set1 set2 fromlist ".?AIRj" ghci > Set.difference set2 set1 fromlist "!Tbcgvw" Subset - Funkcja służy do sprawdzania czy set A jest podzbiorem setu B. ghci > Set.fromList [2,3,4] `Set.isSubsetOf ` Set.fromList [1,2,3,4,5] Sety są często używane do usuwania duplikatów przez konwersję fromlist a potem tolist. Tak naprawdę Data.List posiada funkcję nub która też może usuwać duplikaty ale przy dużych listach pierwsza metoda jest dużo szybsza. f) Tworzenie własnych modułów Podobne funkcje można łączyć w moduły dzięki czemu nie trzeba ich od nowa pisać gdy są potrzebne w innym programie aby ich użyć wystarczy zaimportować moduł. Dla przykładu utworzymy moduł Geometry który będzie liczył pole, obwód i wysokości trójkąta. W tym celu tworzymy plik Geometry hs. module Geometry Strona 8 z 9

module Geometry ( trojkatpole, trojkatobwod, trojkatwysokosc ) where trojkatpole :: Float -> Float -> Float -> Float trojkatpole a b c = (sqrt((a+b+c)*(a+b-c)*(a-b+c)*(-a+b+c)))/4 trojkatobwod :: Float -> Float -> Float -> Float trojkatobwod a b c = a + b + c trojkatwysokosc :: Float -> Float -> Float -> [(Float)] trojkatwysokosc a b c = [(sqrt(- (a + b + c)*(a + b - c)*(a - b - c)*(a - b + c)))/(2*a),(sqrt(- (a + b + c)*(a + b - c)*(a - b - c)*(a - b + c)))/(2*b),(sqrt(- (a + b + c)*(a + b - c)*(a - b - c)*(a - b + c)))/(2*c)] Teraz aby użyć tego modułu wystarczy go zaimportować: import Geometry Plik geometry.hs musi się znajdować w tym samym folderze co program w którym go importujemy. *Geometry> trojkatpole 3 4 5 6.0 Strona 9 z 9