Programovací jazyk Haskell doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007  59 732 4213.

Slides:



Advertisements
Podobné prezentace
Standardní knihovní funkce pro práci s textovými řetězci
Advertisements

Pro začátek něco lehčího
Tomáš Petříček Microsoft C# MVP
Vstup a výstup Ing. Lumír Návrat  katedra informatiky, A-1018 
ŘÍDÍCÍ STRUKTURY - PODMÍNKY
Vstup a výstup doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007 
Základy jazyka SQL Jan Tichava
Programovací jazyk C++
Třída SIMSET je druhou standardní systémovou třídou, která obsahuje prostředky pro práci se spojovými seznamy. KRUHOVÉ SPOJOVÉ SEZNAMY Spojový seznam –
Přednáška 11 Jiří Šebesta
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 
1 Vnitřní řazení s využitím dynamických struktur Tvorba spojového seznamu je vcelku triviální záležitostí: a)Vytvořím prázdný seznam příkazem LIST:=nil.
Programovací jazyk Prolog
Programování v Pascalu Přednáška 3
Programování v Pascalu Přednáška 5 RNDr. Hana Havelková.
Programování v Pascalu Přednáška 9 RNDr. Hana Havelková.
Alg51 Rozklad problému na podproblémy Postupný návrh programu rozkladem problému na podproblémy –zadaný problém rozložíme na podproblémy –pro řešení podproblémů.
BPGA RS Logix 500 a Logix 5000 Ing. Radek Štohl, Ph.D.
Cvičení 2 Proměnné(jednoduché a složené) a konstanty První program Zápis výrazů.
Programovací jazyk Haskell Ing. Lumír Návrat  katedra informatiky, A 1018 
Programování v Pascalu Přednáška 7
Materiály k přednášce Úvod do programování Ondřej Čepek.
Medians and Order Statistics Nechť A je množina obsahující n různých prvků: Definice: Statistika i-tého řádu je i-tý nejmenší prvek, tj., minimum = statistika.
1 Vyhledávání Principy vyhledávání Klasifikace klíče:  Interní klíč – je součástí prohlížených záznamů  Externí klíč – není jeho součástí, je jím např.
Dlouhodobá maturitní práce studentů Tomáše Kurce & Jana Kuželky
Informatika I 3. přednáška
Podmienený príkaz. Kĺúčové slová  Pro podmínky se v Pascalu používají klíčové příkazy IF, THEN a ELSE.  Také se jim říká „príkaz vetvenia"..  Příkaz.
Algoritmy a programovací techniky
Datové struktury a algoritmy Část 5 Abstraktní datové typy
Abstraktní datové typy doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007 
PictureBox u vkládání obrázků u vlastnost Picture pomocí příkazu LoadPicture u přiřazení obrázku mezi dvěma prvky PictureBox Auto.Picture = AutoCerv.Picture.
5. Procedury a funkce Procedura je samostatně odladěný algoritmus, v programu může být volána vícekrát. Dvojí terminologie - rozlišujeme procedury a funkce.
Funkcionální programování Haskell
Orbis pictus 21. století Tato prezentace byla vytvořena v rámci projektu.
7. Typ soubor Souborem dat běžně rozumíme uspořádanou množinu dat, uloženou mimo operační paměť počítače (na disku). Pascalský soubor je abstrakcí skutečného.
Aplikační počítačové prostředky X15APP MATLAB Katedra elektroenergetiky, Fakulta elektrotechniky ČVUT, Technická 2, Praha 6 Ing. Zbyněk Brettschneider.
UNIX Shell skripty Roman Danel VŠB TU Ostrava, Hornicko – geologická fakulta.
Klikací mapy v GIMPu Tvorba tzv. klikacích (obrázkových) map s pomocí grafického editoru GIMP Dostupné z Metodického portálu ISSN: ,
Import záznamů diplomových prací nové řešení Antonín Vaishar, SUAleph, 26. –
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 
Soubory BI-PA1 Programování a algoritmizace 1, ZS Katedra teoretické informatiky © Miroslav Balík Fakulta informačních technologií České vysoké.
Aplikační počítačové prostředky X15APP MATLAB cvičení 4
Jazyk C A0B36PRI - PROGRAMOVÁNÍ Část II.
5. Statistica Vytvořil Institut biostatistiky a analýz, Masarykova univerzita J. Jarkovský, L. Dušek, M. Cvanová.
Úvod do UNIXu (6th round)
doc. RNDr. Zdeněk Botek, CSc.
Operační systém UNIX Příkazové prostředí UNIXu: příkaz [argumenty] [jméno] Ve jménech příkazů a parametrech se rozlišují malá a velká písmena.
Úvod do UNIXu (6 th round) David Hoksza
Funkcionální programování Haskell Jan Hric, KTIML MFF UK,
Praha & EU: Investujeme do vaší budoucnosti Evropský sociální fond Gymnázium, Praha 10, Voděradská 2 Projekt OBZORY Datové typy a operátory Základní programové.
ZPRACOVÁNÍ VSTUPŮ POST a GET. METODY ZPRACOVÁNÍ VSTUPŮ 2.
Funkcionální programování Haskell
Programování ENUM, SWITCH,pole jednorozměrná a vícerozměrná, deklarace, inicializace, kopírování, porovnání Erik Král.
Programovací jazyk C++
Algoritmizace a programování
Databázové systémy a SQL
Databázové systémy a SQL
Opakování základních příkazů a syntaxí v programovacím jazyce Pascal
Programovací jazyk Haskell
Podprogramy.
Databázové systémy a SQL
Funkcionální programování Haskell
5. Statistica Vytvořil Institut biostatistiky a analýz, Masarykova univerzita J. Jarkovský, L. Dušek, M. Cvanová.
Funkcionální programování Haskell
Funkcionální programování Haskell
Databázové systémy a SQL
CU01 Informatika II 2/13 Základy algoritmizace
Transkript prezentace:

Programovací jazyk Haskell doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007 

2ÚDPJ - Programovací jazyk Haskell Historie září 1991 – Gofer experimentální jazyk experimentální jazyk Mark P. Jones Mark P. Jones únor 1995 – Hugs Hugs98 téměř úplná implementace jazyka Haskell 98 téměř úplná implementace jazyka Haskell 98 některá rozšíření navíc některá rozšíření navíc

3ÚDPJ - Programovací jazyk Haskell Instalace + dokumentace Základní zdroje popis jazyka a knihoven instalace (Win / Unix) uživatelská příručka (je součástí instalace) Další součásti Scholl of Expression (SOE) Scholl of Expression (SOE) Hugs Graphics Library Hugs Graphics Library

4ÚDPJ - Programovací jazyk Haskell Použití Princip výpočtu: kalkulátor $ hugs Prelude> 2*(3+5) 16 Prelude> cos 0 1.0Prelude> Skript: definice uživatelských funkcí $ hugs priklad.hs

5ÚDPJ - Programovací jazyk Haskell Řídicí příkazy Editace souboru :edit [soubor.hs]:e Načtení skriptu :load [soubor.hs]:reload Ukončení :quit Nápověda:? Unix – nastavení editoru v souboru ~/.profile export HUGSFLAGS="-E\"vi +%d %s\" +t +s -u"

6ÚDPJ - Programovací jazyk Haskell Skript priklad.hs module Priklad where -- funkce, která vrací součet dvou čísel soucet x y = x + y priklad.lhs > module Priklad where Funkce, která vrací faktoriál čísla > f n = if n == 0 then 1 else n * f (n-1)

7ÚDPJ - Programovací jazyk Haskell Datové typy Základní datové typy 1::Int 1::Int ‘a’::Char ‘a’::Char True,False::Bool True,False::Bool 3.14::Float 3.14::Float Seznamy [a] prázdný seznam [] prázdný seznam [] neprázdný seznam (x:xs) neprázdný seznam (x:xs) 1:2:3:[] :: [Int] 1:2:3:[] :: [Int] [1,2,3] :: [Int] [1,2,3] :: [Int]

8ÚDPJ - Programovací jazyk Haskell Datové typy Uspořádané n-tice (a,b,c,...) (1,2) :: (Int,Int) (1,2) :: (Int,Int) (1,['a','b'])::(Int, [Char]) (1,['a','b'])::(Int, [Char]) () :: () () :: () Funkce a->b faktorial :: Int -> Int faktorial :: Int -> Int soucet :: Int -> Int -> Int soucet :: Int -> Int -> Int plus :: (Int, Int) -> Int plus :: (Int, Int) -> Int

9ÚDPJ - Programovací jazyk Haskell Datové typy Uživatelské datové typy data Barva = Cerna data Barva = Cerna | Bila | Bila data Tree a = Leaf a data Tree a = Leaf a | Node a (Tree a) (Tree a) | Node a (Tree a) (Tree a) type String = [Char] type String = [Char] type Tabulka a = [(String, a)] type Tabulka a = [(String, a)]

10ÚDPJ - Programovací jazyk Haskell Definice funkcí Rovnice a unifikace vzorů (pattern matching): f pat11 pat12... = rhs1 f pat11 pat12... = rhs1 f pat21 pat22... = rhs2 f pat21 pat22... = rhs Vybere se první rovnice vyhovující parametrům Pokud se nenajde  chyba

11ÚDPJ - Programovací jazyk Haskell Vzory proměnná inc x = x + 1 inc x = x + 1konstanta not True = False not True = False not False = True not False = Trueseznam length [] = 0 length [] = 0 length (x:xs) = 1 + length xs length (x:xs) = 1 + length xs

12ÚDPJ - Programovací jazyk Haskell Vzory n-tice plus (x,y) = x+y plus (x,y) = x+y konstruktor uživatelského typu nl (Leaf _) = 1 nl (Leaf _) = 1 nl (Tree _ l r) = (nl l) + (nl r) nl (Tree _ l r) = (nl l) + (nl r) pojmenování části vzoru duphd = x:p duphd = x:p

13ÚDPJ - Programovací jazyk Haskell Vzory anonymní proměnná _ hd (x:_) = x hd (x:_) = x vzor typu n+k fact 0 = 1 fact 0 = 1 fact (n+1) = (n+1)*fact n fact (n+1) = (n+1)*fact n strážené rovnice fact n | n == 0 = 1 | otherwise = n * fact(n-1) fact n | n == 0 = 1 | otherwise = n * fact(n-1)

14ÚDPJ - Programovací jazyk Haskell Příklady Faktoriál fakt1 n = if n == 0 then 1 else n * fakt1 (n-1) fakt1 n = if n == 0 then 1 else n * fakt1 (n-1) fakt2 0 = 1 fakt2 n = n * fakt2 (n-1) fakt2 0 = 1 fakt2 n = n * fakt2 (n-1) fakt3 0 = 1 fakt3 (n+1) = (n+1) * fakt3 n fakt3 0 = 1 fakt3 (n+1) = (n+1) * fakt3 n fakt4 n | n == 0 = 1 | otherwise = n * fakt4 (n-1) fakt4 n | n == 0 = 1 | otherwise = n * fakt4 (n-1)

15ÚDPJ - Programovací jazyk Haskell Příklady Fibonacciho čísla fib :: Int -> Int fib 0 = 0 fib 1 = 1 fib (n+2) = fib n + fib (n+1) fib :: Int -> Int fib 0 = 0 fib 1 = 1 fib (n+2) = fib n + fib (n+1)

16ÚDPJ - Programovací jazyk Haskell Příklady Délka seznamu length [] = 0 length (x:xs) = 1 + length xs length [] = 0 length (x:xs) = 1 + length xs Poznámka: pozor na konflikt s předdefinovanými funkcemi! module Pokus where import Prelude hiding(length) length [] = 0 length (_:xs) = 1 + length xs module Pokus where import Prelude hiding(length) length [] = 0 length (_:xs) = 1 + length xs

17ÚDPJ - Programovací jazyk Haskell Lokální definice Konstrukce let... in f x y = let p = x + y q = x – y in p * q f x y = let p = x + y q = x – y in p * q Konstrukce where f x y = p * q where p = x + y q = x - y f x y = p * q where p = x + y q = x - y

18ÚDPJ - Programovací jazyk Haskell Částeční aplikace funkcí Curryho tvar funkce add :: Int -> Int -> Int add x y = x + y add :: Int -> Int -> Int add x y = x + y plus :: (Int, Int) -> Int plus (x,y) = x + y plus :: (Int, Int) -> Int plus (x,y) = x + y add = curry plus curry :: ? add = curry plus curry :: ? plus = uncurry add uncurry :: ? plus = uncurry add uncurry :: ? Řezy funkce inc x = 1 + x inc x = 1 + x inc x = add 1 x inc x = add 1 x inc = add 1 inc = add 1 inc = (+1) = (1+) inc = (+1) = (1+) add = (+) add = (+)

19ÚDPJ - Programovací jazyk Haskell Příklady Vytvoření seznamu druhých mocnin dm [] = [] dm (x:xs) = sq x : dm xs where sq x = x * x dm [] = [] dm (x:xs) = sq x : dm xs where sq x = x * x Seřazení seznamu (quicksort) qs [] = [] qs (x:xs) = let ls = filter ( =x) xs in qs ls ++ [x] ++ qs rs qs [] = [] qs (x:xs) = let ls = filter ( =x) xs in qs ls ++ [x] ++ qs rs

20ÚDPJ - Programovací jazyk 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

21ÚDPJ - Programovací jazyk 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

22ÚDPJ - Programovací jazyk 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]

23ÚDPJ - Programovací jazyk Haskell Úkol Pokuste se uvedené funkce pro seznamy implementovat co je triviální případ? co je triviální případ? length [] = 0 maximum [x] = x funkci umím udělat s kratším seznamem -> jak tuto hodnotu zkombinuji s prvním prvkem seznamu, abych dostal výsledek? funkci umím udělat s kratším seznamem -> jak tuto hodnotu zkombinuji s prvním prvkem seznamu, abych dostal výsledek? maximum (x:y:ys) | x > y = maximum (x:ys) | otherwise = maximum (y:ys) maximum (x:y:ys) | x > y = maximum (x:ys) | otherwise = maximum (y:ys)