Programovací jazyk Haskell

Podobné dokumenty
Programovací í jazyk Haskell

Functional and Logic Programming Functional languages

Definice uživatelského typu. Uživatelem definované typy. Součinové datové typy. Součtové datové typy. FLP - Uživatelem definované typy

IB015 Neimperativní programování. Seznamy, Typy a Rekurze. Jiří Barnat Libor Škarvada

IB015 Neimperativní programování. Časová složitost, Typové třídy, Moduly. Jiří Barnat Libor Škarvada

Martin Milata, Pokud je alespoň jeden rozměr čokolády sudý (s výjimkou tabulky velikosti 1x2, která už je od

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

4. Rekurze. BI-EP1 Efektivní programování Martin Kačer

IB015 Neimperativní programování. Redukční strategie, Seznamy program QuickCheck. Jiří Barnat Libor Škarvada

Motivace. Vstup a výstup. Minimální komunikace. Motivace. ÚDPJ - Vstup a výstup. Ing. Lumír Návrat katedra informatiky, A

Funkcionální programování. Kristýna Kaslová

JavaScript 101. "Trocha života do statických stránek"

Abstraktní datové typy: zásobník

Haskell Hero učební text

SPJA, cvičení 1. ipython, python, skripty. základy syntaxe: základní datové typy, řetězce. podmínky: if-elif-else, vyhodnocení logických výrazů

Úvod do programovacích jazyků (Java)

Úvod do Matlabu. Praha & EU: Investujeme do vaší budoucnosti. 1 / 24 Úvod do Matlabu

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

Řídicí struktury. alg3 1

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Jazyk C# (seminář 5)

PG 9.5 novinky ve vývoji aplikací

Komponenty v.net. Obsah přednášky

PARADIGMATA PROGRAMOVÁNÍ 2 PŘÍSLIBY A LÍNÉ VYHODNOCOVÁNÍ

JAVA. Další jazyky kompilovatelné do Java byte-code

Přednáška 3. Rekurze 1

ÚVODNÍ ZNALOSTI. datové struktury. správnost programů. analýza algoritmů

Databázové systémy. - SQL * definice dat * aktualizace * pohledy. Tomáš Skopal

Konstruktory překladačů

Basic256 - úvod do programování Příklady. ing. petr polách

Funkcionální programování Haskell

Paradigmata programování 1

A7B38UOS Úvod do operačních systémů. 6. Cvičení. Příkazy sed a awk

NPRG030 Programování I, 2017/18 1 / :22:16

infixr 0 $! ($!) :: (a->b) -> a -> b f $! x =... interni, pro striktni vyhodnocovani -- vyhodnoti top konstruktor x -}

Algoritmizace prostorových úloh

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

Algoritmizace prostorových úloh

Úvod do programovacích jazyků (Java)

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Implementace LL(1) překladů

ALGORITMIZACE A PROGRAMOVÁNÍ

Funkcionální programování Haskell

PODOBÁ SE JAZYKU C S NĚKTERÝMI OMEZENÍMI GLOBÁLNÍ PROMĚNNÉ. NSWI162: Sémantika programů 2

WSH Windows Script Hosting. OSY 2 Přednáška číslo 2 opravená verze z

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

3. přednáška. Obsah: Řídící struktury sekvence, if-else, switch, for, while, do-while. Zpracování posloupnosti

Funkce pokročilé možnosti. Úvod do programování 2 Tomáš Kühr

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

Rekurze. Pavel Töpfer, 2017 Programování 1-8 1

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Programovací jazyk Pascal

Regulární výrazy. Filtry grep, sed a awk.

Poslední nenulová číslice faktoriálu

Zápis programu v jazyce C#

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

Základy algoritmizace a programování

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

Programování v jazyce JavaScript

8 Třídy, objekty, metody, předávání argumentů metod

int => unsigned int => long => unsigned long => float => double => long double - tj. bude-li:

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Třetí skupina zadání projektů do předmětu Algoritmy II, letní semestr 2017/2018

Regulární výrazy. Vzory

IB015 Neimperativní programování. Organizace a motivace kurzu, programovací jazyk Haskell. Jiří Barnat

Jazyk C# a platforma.net

Programování v Pythonu

Informační systémy 2008/2009. Radim Farana. Obsah. Dotazy přes více tabulek

Skripty základy VB, vestavěné objekty, příklady

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Abstraktní datové typy

Lokální definice (1) plocha-kruhu

Programování v jazyce JavaScript

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

Kurz Databáze. Obsah. Dotazy. Zpracování dat. Doc. Ing. Radim Farana, CSc.

Funkcionální programování Haskell

Proměnná. Datový typ. IAJCE Cvičení č. 3. Pojmenované místo v paměti sloužící pro uložení hodnoty.

Popis souboru pro generování reportů *.report

Úvod do databázových systémů

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Základní datové struktury

PCKEYB JEDNOTKA PRO OBSLUHU KLÁVESNICE TYPU PC AT. Příručka uživatele a programátora

Časová a prostorová složitost algoritmů

Předmluva 9 Obsah knihy 9 Typografické konvence 10 Informace o autorovi 10 Poděkování 10

Základy algoritmizace. Hašování

Paměť počítače. alg2 1

Sada 1 - PHP. 03. Proměnné, konstanty

Kritéria hodnocení praktické maturitní zkoušky z databázových systémů

Proměnné a parametry. predn_08.odt :00:38 1

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

DSL manuál. Ing. Jan Hranáč. 27. října V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

Přednáška 8. Proměnné. Psaní a ladění skriptů. Parametry skriptu. Vstup a výstup. Konfigurační soubory shellu. Úvod do Operačních Systémů Přednáška 8

5 Přehled operátorů, příkazy, přetypování

9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek

2 Strukturované datové typy Pole Záznam Množina... 4

Transformace dat: používání syntaxe v SPSS

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Transkript:

Programovací jazyk Haskell Ing. Lumír Návrat katedra informatiky, D 403 59 732 3252 Historie září 1991 Gofer experimentální jazyk Mark P. Jones únor 1995 Hugs Hugs98 téměř úplná implementace jazyka Haskell 98 některá rozšíření navíc FLP - Programovací jazyk Haskell 2 Instalace + dokumentace Základní zdroje http://haskell.org popis jazyka a knihoven http://haskell.org/hugs instalace (Win / Unix) uživatelská příručka (je součástí instalace) Další součásti Scholl of Expression (SOE) Hugs Graphics Library Použití Princip výpočtu: kalkulátor $ hugs Prelude> 2*(3+5) 16 Prelude> cos 0 1.0 Prelude> Skript: definice uživatelských funkcí $ hugs priklad.hs FLP - Programovací jazyk Haskell 3 FLP - Programovací jazyk Haskell 4 1

Ří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" 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) FLP - Programovací jazyk Haskell 5 FLP - Programovací jazyk Haskell 6 Datové typy Základní datové typy 1::Int a ::Char True,False::Bool 3.14::Float Seznamy [a] prázdný seznam [] neprázdný seznam (x:xs) 1:2:3:[] :: [Int] [1,2,3] :: [Int] FLP - Programovací jazyk Haskell 7 Datové typy Uspořádané n-tice (a,b,c,...) (1,2) :: (Int,Int) (1,['a','b'])::(Int, [Char]) () :: () Funkce a->b faktorial :: Int -> Int soucet :: Int -> Int -> Int plus :: (Int, Int) -> Int FLP - Programovací jazyk Haskell 8 2

Datové typy Uživatelské datové typy data Barva = Cerna Bila data Tree a = Leaf a Node a (Tree a) (Tree a) type String = [Char] type Tabulka a = [(String, a)] Definice funkcí Rovnice a unifikace vzorů (pattern matching): f pat11 pat12... = rhs1 f pat21 pat22... = rhs2... Vybere se první rovnice vyhovující parametrům Pokud se nenajde chyba FLP - Programovací jazyk Haskell 9 FLP - Programovací jazyk Haskell 10 Vzory proměnná inc x = x + 1 konstanta not True = False not False = True seznam length [] = 0 length (x:xs) = 1 + length xs Vzory n-tice plus (x,y) = x+y konstruktor uživatelského typu nl (Leaf _) = 1 nl (Tree _ l r) = (nl l) + (nl r) pojmenování části vzoru duphd p@(x:xs) = x:p FLP - Programovací jazyk Haskell 11 FLP - Programovací jazyk Haskell 12 3

Vzory anonymní proměnná _ hd (x:_) = x vzor typu n+k fact 0 = 1 fact (n+1) = (n+1)*fact n strážené rovnice fact n n == 0 = 1 otherwise = n * fact(n-1) Faktoriál fakt1 n = if n == 0 then 1 else n * fakt1 (n-1) fakt2 0 = 1 fakt2 n = n * fakt2 (n-1) fakt3 0 = 1 fakt3 (n+1) = (n+1) * fakt3 n fakt4 n n == 0 = 1 otherwise = n * fakt4 (n-1) FLP - Programovací jazyk Haskell 13 FLP - Programovací jazyk Haskell 14 Fibonacciho čísla fib :: Int -> Int fib 0 = 0 fib 1 = 1 fib (n+2) = fib n + fib (n+1) Délka seznamu 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 FLP - Programovací jazyk Haskell 15 FLP - Programovací jazyk Haskell 16 4

Lokální definice Konstrukce let... in 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 Částeční aplikace funkcí Curryho tvar funkce add :: Int -> Int -> Int add x y = x + y plus :: (Int, Int) -> Int plus (x,y) = x + y add = curry plus curry ::? plus = uncurry add uncurry ::? Řezy funkce inc x = 1 + x inc x = add 1 x inc = add 1 inc = (+1) = (1+) add = (+) FLP - Programovací jazyk Haskell 17 FLP - Programovací jazyk Haskell 18 Vytvoření seznamu druhých mocnin 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 rs = filter (>=x) xs in qs ls ++ [x] ++ qs rs 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 - Programovací jazyk Haskell 19 FLP - Programovací jazyk Haskell 20 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 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 - Programovací jazyk Haskell 21 FLP - Programovací jazyk Haskell 22 Úkol Pokuste se uvedené funkce pro seznamy implementovat 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? maximum (x:y:ys) x > y = maximum (x:ys) otherwise = maximum (y:ys) FLP - Programovací jazyk Haskell 23 6