Seznamy v jazyce Haskell Ing. Lumír Návrat  katedra informatiky, D-403  59 732 3252.

Slides:



Advertisements
Podobné prezentace
ŘEŠENÍ ÚLOH V EXCELU.
Advertisements

Množiny Přirozená čísla Celá čísla Racionální čísla Komplexní čísla
Tomáš Petříček Microsoft C# MVP
Vstup a výstup Ing. Lumír Návrat  katedra informatiky, A-1018 
Logaritmus a věty o logaritmech
Uživatelem definované typy doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007 
JUI - 3. přednáška Zpracování seznamů, predikátové a vyhodnocovací funkce RNDr. Jiří Dvořák, CSc.
Seznamy v jazyce Haskell doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007 
Programovací jazyk Prolog
Programování v Pascalu Přednáška 3
Informatika pro ekonomy II přednáška 11
Databázové systémy I Přednáška č. 5 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Programovací jazyk Haskell Ing. Lumír Návrat  katedra informatiky, A 1018 
Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti
Fakulta životního prostředí Katedra informatiky a geoinformatiky
Fakulta životního prostředí Katedra informatiky a geoinformatiky
F U N K C E.
Analytická geometrie pro gymnázia
Úvod do databázových systémů
Informatika pro ekonomy II přednáška 10
SQL – základní pojmy Ing. Roman Danel, Ph.D.
V matematice existují i seskupení objektů, které nejsou množinami.
Informatika I 4. přednáška
Fakulta životního prostředí Katedra informatiky a geoinformatiky
Abstraktní datové typy doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007 
Databázové systémy Přednáška č. 3.
ÚHEL DVOU VEKTORŮ Mgr. Zdeňka Hudcová TENTO PROJEKT JE SPOLUFINANCOVÁN EVROPSKÝM SOCIÁLNÍM FONDEM A STÁTNÍM ROZPOČTEM ČR Poznámky v PDF.
Pre-algebra Antonín Jančařík.
Funkcionální programování Haskell
TENTO PROJEKT JE SPOLUFINANCOVÁN EVROPSKÝM SOCIÁLNÍM FONDEM
Programovací jazyk Haskell doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007 
ZÁKLADY TEORIE PRAVDĚPODOBNOSTI
Relace, operace, struktury
Databázové systémy Informatika pro ekonomy, př. 18.
Množiny.
MATEMATIKA Obsah přednášky Funkce. 3. Limita funkce
Vektorové prostory.
Spojení a průnik podprostorů
XQuery Dotazovací jazyk XML Daniel Privalenkov. O čem bude prezentace Nutnost dotazovacího jazyku v XML Rychlý přehled XQuery Několik příkladů.
Úvod do logiky (presentace 2) Naivní teorie množin, relace a funkce
2. Vybrané základní pojmy matematické statistiky
Uživatelem definované typy Ing. Lumír Návrat  katedra informatiky, A 1018 
Čísla Množiny a podmnožiny čísel Přirozená čísla Nula Celá čísla
Grafické řešení Jediné optimální řešení. Zadání příkladu z = 70x x 2 → MAX omezení:  x 1 + 2x 2 ≤ 360  x 1 + x 2 ≤ 250  x i ≥ 0, i= 1, 2.
Aplikační počítačové prostředky X15APP MATLAB cvičení 4
doc. RNDr. Zdeněk Botek, CSc.
Funkcionální programování Haskell Jan Hric, KTIML MFF UK,
Skalární součin 2 vektorů
Než začneme programovat Co lze v MALATBu dělat, aniž musíme napsat program. © Leonard Walletzký, ESF MU, 2000.
EMM21 Ekonomicko-matematické metody 2 Prof. RNDr. Jaroslav Ramík,CSc.
Základy RA RA = matematický základ pro relační modul DBS jazyk SQL Relační DBS = Relační algebra + Relační model Doména = množina hodnot stejného typu/významu.
ČÍSLO PROJEKTU CZ.1.07/1.5.00/ ČÍSLO MATERIÁLU 4 – Intervaly – teorie NÁZEV ŠKOLY Střední škola a Vyšší odborná škola cestovního ruchu, Senovážné.
MNOŽINY RNDr. Jiří Kocourek. Množina: skupina (souhrn, soubor) nějakých objektů.
ALGEBRAICKÉ STRUKTURY
Kartézský součin Binární relace
SQL – příkaz SELECT Ing. Roman Danel, Ph.D.
MATEMATIKA Obsah přednášky. Opakování, motivační příklady Funkce.
MATEMATIKA Obsah přednášky. Opakování, motivační příklady Funkce.
TENTO PROJEKT JE SPOLUFINANCOVÁN EVROPSKÝM SOCIÁLNÍM FONDEM
ČÍSELNÉ MNOŽINY, INTERVALY
VY_32_INOVACE_PR2_15 Vybrané komponenty.
Informatika pro ekonomy přednáška 8
1 Lineární (vektorová) algebra
Matematická logika 5. přednáška
Programovací jazyk Haskell
MNOŽINY RNDr. Jiří Kocourek.
Funkcionální programování Haskell
Fyzikální veličiny Míry fyzikálních vlastností: X = x [X]
ČÍSELNÉ MNOŽINY, INTERVALY
M-Ji-CU007-Mnozinove_operace
Transkript prezentace:

Seznamy v jazyce Haskell Ing. Lumír Návrat  katedra informatiky, D-403 

FLP - Funkcionální a logické programování2 Definice seznamu data List a = Cons a (List a) (x:xs) | Nil [] : ( 2 : ( 3 : [ ] ) )

FLP - Funkcionální a logické programování3 Nekonečné seznamy ones = 1 : ones natFrom n = n : natFrom (n+1) natFrom 1 = 1 : 2 : 3 : … = [1..] 1

FLP - Funkcionální a logické programování4 Funkce pro seznamy Přístup k prvkům seznamu head [1,2,3] = 1 tail [1,2,3] = [2,3] last [1,2,3] = 3 init [1,2,3] = [1,2] [1,2,3] !! 2 = 3 null [] = True length [1,2,3] = 3

FLP - Funkcionální a logické programování5 Funkce pro seznamy Spojení seznamů [1,2,3] ++ [4,5] = [1,2,3,4,5] [[1,2],[3],[4,5]] = [1,2,3,4,5] zip [1,2] [3,4,5] = [(1,3),(2,4)] zipWith (+) [1,2] [3,4] = [4,6] Agregační funkce sum [1,2,3,4] = 10 product [1,2,3,4] = 24 minimum [1,2,3,4] = 1 maximum [1,2,3,4] = 4

FLP - Funkcionální a logické programování6 Funkce pro seznamy Výběr části seznamu take 3 [1,2,3,4,5] = [1,2,3] drop 3 [1,2,3,4,5] = [4,5] takeWhile (> 0) [1,3,0,4] = [1,3] dropWhile (> 0) [1,3,0,4] = [0,4] filter (>0) [1,3,0,2,-1] = [1,3,2] Transformace seznamu reverse [1,2,3,4] = [4,3,2,1] map (*2) [1,2,3] = [2,4,6]

FLP - Funkcionální a logické programování7 Aritmetické řady [m..n] [1..5] = [1,2,3,4,5] [m1,m2..n] [1,3..10] = [1,3,5,7,9] [m..] [1..] = [1,2,3,4,5,…] [m1,m2..] [5,10..] = [5,10,15,20,25,…]

FLP - Funkcionální a logické programování8 Výběr všech prvků seznamu splňujících zadanou podmínku (predikát) filter :: [a] -> (a->Bool) -> [a] filter _ [ ] = [ ] filter p (x:xs) | p x = x : filter p xs | otherwise = filter p xs filter even [1..10] = [2,4,6,8] filter (> 0) [1,3,0,2,-1] = [1,3,2] delitele n = filter deli [1..n] where deli m = n `mod` m == 0 Funkce filter

FLP - Funkcionální a logické programování9 Poznámka – lambda abstrakce Zadání funkce jako parametru nenulove xs = filter p xs where p x = x /= 0 nenulove xs = filter (/= 0) xs nenulove xs = filter (\x -> x/=0) xs \ x -> e … λx. e inc = \x -> x+1 plus = \(x,y) -> x + y delitele n = filter (\m -> n `mod` m == 0) [1..n]

FLP - Funkcionální a logické programování10 Funkce map Transformace prvků v seznamu map :: [a] -> (a->b) -> [b] map f [ ] = [ ] map f (x:xs) = f x : map f xs map (+1) [1,2,3] = [2,3,4] map toUpper “abcd” = “ABCD” mocniny = map (\x -> x * x) [1..]

FLP - Funkcionální a logické programování11 Generátory seznamů Příklad: Množina všech sudých čísel z intervalu { x | x  1..10, x je sudé } [ x | x <- [1..10], even x ] [ x | x <- xs ] = xs [ f x | x <- xs ] = map f xs [ x | x <- xs, p x ] = filter p xs [ (x,y) | x<-xs, y<-ys ] = [(x1,y1),(x1,y2),(x1,y3),…, (x2,y1),(x2,y2),(x2,y3),…, … ]

FLP - Funkcionální a logické programování12 Příslušnost prvku do seznamu elem 1 [2,3,4] = False elem 2 [2,3,4] = True elem 3 [] = False elem _ [ ] = False elem x (y:ys) | x == y = True | otherwise = elem x ys Jakého typu je funkce elem? elem :: a -> [a] -> Bool --- NE!!! (elem sin [sin,cos,tan] = ?)

FLP - Funkcionální a logické programování13 Poznámka k typovým třídám Třída – množina typů s určitými operacemi Num: +, -, *, abs, negate, signum, … Eq: ==, /= Ord: >, >=, <, <=, min, max Omezení specifikace typu elem :: Eq a => a -> [a] -> Bool minimum :: Ord a => [a] -> a sum :: Num a => [a] -> a

FLP - Funkcionální a logické programování14 Příklady Seznam jako množina průnik sjednocení rozdíl podmnožina intersect xs ys = [y | y <-ys, elem y xs] union xs ys = xs ++ [y | y<-ys, notElem y xs] diff xs ys = [x | x<-xs, notElem x ys] subset xs ys = [x | x<-xs, notElem x ys] == [] subset xs ys = all (\x -> elem x ys) xs

FLP - Funkcionální a logické programování15 Dokazování pomocí indukce Matematická indukce a)dokážeme pro n = 0 b)za předpokladu, že platí pro n, dokážeme pro n+1 Strukturální indukce pro seznamy a)dokážeme pro [] b)za předpokladu, že platí pro xs, dokážeme pro (x:xs)

FLP - Funkcionální a logické programování16 Příklad – asociativita ++ (xs ++ ys) ++ zs = xs ++ (ys ++ zs) [] ++ ys = ys(++.1) (x:xs) ++ ys = x: (xs ++ ys) (++.2) a) [ ] => xs ([] ++ ys) ++ zs = ys ++ zs (++.1) = [] ++ (ys ++ zs) (++.1)

FLP - Funkcionální a logické programování17 Příklad – asociativita ++ (xs ++ ys) ++ zs = xs ++ (ys ++ zs) [] ++ ys = ys(++.1) (x:xs) ++ ys = x: (xs ++ ys) (++.2) b) (x:xs) => xs ((x:xs)++ys)++zs = x:(xs++ys)++zs (++.2) = x:((xs++ys)++zs) (++.2) = x:(xs++(ys++zs)) (předpoklad) = (x:xs)++(ys++zs) (++.2)

FLP - Funkcionální a logické programování18 Příklad – length (xs++ys) length (xs++ys) = length xs + length ys length [] = 0(len.1) length (_:xs) = 1 + length xs(len.2) a) [] => xs length ([] ++ ys) = length ys (++.1) = 0 + length ys (nulový prvek +) = length [] + length ys (len.1)

FLP - Funkcionální a logické programování19 Příklad – length (xs++ys) length (xs++ys) = length xs + length ys length [] = 0(len.1) length (_:xs) = 1 + length xs(len.2) b) (x:xs) => xs length ((x:xs) ++ ys) = length (x:(xs++ys)(++.2) = 1 + length (xs++ys)(len.2) = 1 + (length xs + length ys) (předpoklad) = (1 + length xs) + length ys(asociativita +) = length (x:xs) + length ys(len.2)

FLP - Funkcionální a logické programování20 Příklady na cvičení Funkce reverse varianta s časovou složitostí n 2 varianta se složitostí n [1,2,3] [] -> [2,3] [1] -> [3] [2,1] -> [] [3,2,1] Spojení seznamů pomocí funkce zip [1,2,3] [4,5] = [(1,4), (2,5)] zipWith f [1,2,3] [4,5] = [f 1 4, f 2 5] Skalární součin dvou vektorů [1,2,3] * [4,5,6] = 1*4+2*5+3*6 Kartézský součin dvou množin (seznamů) [1,2,3] x [‘a’,’b’] = [(1,’a’),(1,’b’),(2,’a’),(2,’b’),(3,’a’),(3,’b’)