Seznamy v jazyce Haskell doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007  59 732 4213.

Slides:



Advertisements
Podobné prezentace
Statistické funkce v tabulkovém kalkulátoru Excel MS
Advertisements

Množiny Přirozená čísla Celá čísla Racionální čísla Komplexní čísla
Pravidla pro počítání s mocninami
Fakulta životního prostředí Katedra informatiky a geoinformatiky
Iterativní algoritmy pro Gaussovské grafické modely Implementace do SW Mathematica Vladislav Chýna.
Vstup a výstup doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007 
Prolog – seznamy Jan Hric, 1997 – 2010b KTIML MFF UK URL:
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.
Programovací jazyk Prolog
Teorie čísel Nekonečno
Výpočetní technika Akademický rok 2009/2010 Letní semestr Mgr. Petr Novák Katedra informatiky a geoinformatiky FŽP UJEP
Informatika pro ekonomy II přednáška 11
Programovací jazyk Haskell Ing. Lumír Návrat  katedra informatiky, A 1018 
Lineární algebra.
Úvod do Teorie množin.
Největší společný dělitel
Fakulta životního prostředí Katedra informatiky a geoinformatiky
Tento projekt je spolufinancován Evropským sociálním fondem a státním rozpočtem České republiky.
Fakulta životního prostředí Katedra informatiky a geoinformatiky
Datové struktury a algoritmy Část 5 Abstraktní datové typy
Analytická geometrie pro gymnázia
Nechť (, , P) je pravděpodobnostní prostor:
Úvod do databázových systémů
Základy λ- kalkulu doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007 
SQL – základní pojmy Ing. Roman Danel, Ph.D.
Fakulta životního prostředí Katedra informatiky a geoinformatiky
Abstraktní datové typy doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007 
Ú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.
AnotacePrezentace, která se zabývá výpočtem obsahu trojúhelníka. AutorMgr. Václav Simandl JazykČeština Očekávaný výstupŽáci vypočítávají obsah trojúhelníka.
Pre-algebra Antonín Jančařík.
TENTO PROJEKT JE SPOLUFINANCOVÁN EVROPSKÝM SOCIÁLNÍM FONDEM
Funkcionální programování Haskell
TENTO PROJEKT JE SPOLUFINANCOVÁN EVROPSKÝM SOCIÁLNÍM FONDEM
Seznamy, aritmetika. Aritmetika v Prologu Predikát is – soucet (A,B,C) :- C is A+B. – soucin (A,B,C) :- C is A*B.
Statistika 2 Aritmetický průměr, Modus, Medián
Programovací jazyk Haskell doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007 
Databázové systémy Informatika pro ekonomy, př. 18.
Množiny.
Mocnina částečně uspořádané 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ů.
Pravidla pro počítání s mocninami.
Ú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 
Seznamy v jazyce Haskell Ing. Lumír Návrat  katedra informatiky, D-403 
Seznamy, aritmetika. Aritmetika v Prologu Predikát = – A=1 – A=1+1 Predikát is – soucet (A,B,C) :- C is A+B. – soucin (A,B,C) :- C is A*B.
RSA šifra Ronald Rivest, Adi Shamir a Leonard Adlemann.
Výpočetní technika Akademický rok 2008/2009 Letní semestr Mgr. Petr Novák Katedra informatiky a geoinformatiky FŽP UJEP
Teorie zpracování dat RELAČNÍ DATOVÝ MODEL.
Skalární součin 2 vektorů
Operace s množinami Matematika Autor: Mgr. Karla Bumbálková
TENTO PROJEKT JE SPOLUFINANCOVÁN EVROPSKÝM SOCIÁLNÍM FONDEM
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.
ALGEBRAICKÉ STRUKTURY
SQL – příkaz SELECT Ing. Roman Danel, Ph.D.
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
1 Lineární (vektorová) algebra
Matematická logika 5. přednáška
Programovací jazyk Haskell
Funkcionální programování Haskell
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 doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007 

2ÚDPJ - Seznamy v jazyce Haskell Definice seznamu data List a = Cons a (List a) (x:xs) | Nil [] | Nil [] : ( 2 : ( 3 : [ ] ) )

3ÚDPJ - Seznamy v jazyce Haskell Nekonečné seznamy ones = 1 : ones natFrom n = n : natFrom (n+1) natFrom 1 = 1 : 2 : 3 : … = [1..] 1

4ÚDPJ - Seznamy v jazyce Haskell Funkce pro seznamy Přístup k prvkům seznamu head [1,2,3] = 1 head [1,2,3] = 1 tail [1,2,3] = [2,3] tail [1,2,3] = [2,3] last [1,2,3] = 3 last [1,2,3] = 3 init [1,2,3] = [1,2] init [1,2,3] = [1,2] [1,2,3] !! 2 = 3 [1,2,3] !! 2 = 3 null [] = True null [] = True length [1,2,3] = 3 length [1,2,3] = 3

5ÚDPJ - Seznamy v jazyce Haskell 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] [[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)] zip [1,2] [3,4,5] = [(1,3),(2,4)] zipWith (+) [1,2] [3,4] = [4,6] zipWith (+) [1,2] [3,4] = [4,6] Agregační funkce sum [1,2,3,4] = 10 sum [1,2,3,4] = 10 product [1,2,3,4] = 24 product [1,2,3,4] = 24 minimum [1,2,3,4] = 1 minimum [1,2,3,4] = 1 maximum [1,2,3,4] = 4 maximum [1,2,3,4] = 4

6ÚDPJ - Seznamy v jazyce Haskell Funkce pro seznamy Výběr části seznamu take 3 [1,2,3,4,5] = [1,2,3] take 3 [1,2,3,4,5] = [1,2,3] drop 3 [1,2,3] = [4,5] drop 3 [1,2,3] = [4,5] takeWhile (> 0) [1,3,0,4] = [1,3] takeWhile (> 0) [1,3,0,4] = [1,3] dropWhile (> 0) [1,3,0,4] = [0,4] dropWhile (> 0) [1,3,0,4] = [0,4] filter (>0) [1,3,0,2,-1] = [1,3,2] filter (>0) [1,3,0,2,-1] = [1,3,2] Transformace seznamu reverse [1,2,3,4] = [4,3,2,1] reverse [1,2,3,4] = [4,3,2,1] map (*2) [1,2,3] = [2,4,6] map (*2) [1,2,3] = [2,4,6]

7ÚDPJ - Seznamy v jazyce Haskell Aritmetické řady [m..n] [1..5] = [1,2,3,4,5] [1..5] = [1,2,3,4,5][m1,m2..n] [1,3..10] = [1,3,5,7,9] [1,3..10] = [1,3,5,7,9][m..] [1..] = [1,2,3,4,5,…] [1..] = [1,2,3,4,5,…][m1,m2..] [5,10..] = [5,10,15,20,25,…] [5,10..] = [5,10,15,20,25,…]

8ÚDPJ - Seznamy v jazyce Haskell 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 | 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 where deli m = n `mod` m == 0 Funkce filter

9ÚDPJ - Seznamy v jazyce Haskell 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 inc = \x -> x+1 plus = \(x,y) -> x + y plus = \(x,y) -> x + y delitele n = filter (\m -> n `mod` m == 0) [1..n] delitele n = filter (\m -> n `mod` m == 0) [1..n]

10ÚDPJ - Seznamy v jazyce Haskell 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..]

11ÚDPJ - Seznamy v jazyce Haskell 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, x je sudé } [ x | x <- [1..10], even x ] [ 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),…, … ]

12ÚDPJ - Seznamy v jazyce Haskell 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] = ?)

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

14ÚDPJ - Seznamy v jazyce Haskell Příklady Seznam jako množina průnik průnik sjednocení sjednocení rozdíl rozdíl podmnožina 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

15ÚDPJ - Seznamy v jazyce Haskell 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)

16ÚDPJ - Seznamy v jazyce Haskell 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)

17ÚDPJ - Seznamy v jazyce Haskell 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)

18ÚDPJ - Seznamy v jazyce Haskell 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)

19ÚDPJ - Seznamy v jazyce Haskell 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)

20ÚDPJ - Seznamy v jazyce Haskell Příklady na cvičení Funkce reverse varianta s časovou složitostí n 2 varianta s časovou složitostí n 2 varianta se složitostí n varianta se složitostí n [1,2,3] [] -> [2,3] [1] -> [3] [2,1] -> [] [3,2,1] [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)] zip [1,2,3] [4,5] = [(1,4), (2,5)] zipWith f [1,2,3] [4,5] = [f 1 4, f 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 [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’) [1,2,3] x [‘a’,’b’] = [(1,’a’),(1,’b’),(2,’a’),(2,’b’),(3,’a’),(3,’b’)