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

Podobné dokumenty
Funkcionální programování

Algoritmizace a programování

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

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

Algoritmizace a programování

Prolog PROgramming in LOGic část predikátové logiky prvního řádu rozvoj začíná po roce 1970 Robert Kowalski teoretické základy Alain Colmerauer, David

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

Úvod do programovacích jazyků (Java)

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

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

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

Programovací jazyk Pascal

Maturitní otázky z předmětu PROGRAMOVÁNÍ

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

6 Příkazy řízení toku

Úvod do programování. Lekce 1

Programovací jazyk Haskell

Programovací í jazyk Haskell

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

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

IB111 Programování a algoritmizace. Programovací jazyky

Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h>

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

ALGORITMIZACE A PROGRAMOVÁNÍ

- speciální symboly + - * / =., < > <> <= >= a další. Klíčová slova jsou chráněnými útvary, které nelze použít ve významu identifikátorů.

Functional and Logic Programming Functional languages

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

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

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

IB111 Úvod do programování skrze Python Přednáška 13

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

Paradigmata programování 1

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

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

Programové konvence, dokumentace a ladění. Programování II 2. přednáška Alena Buchalcevová

Funkcionální programování úvod

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

Programování v Pythonu

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

KAPITOLA 9 - POKROČILÁ PRÁCE S TABULKOVÝM PROCESOREM

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

Výčtový typ strana 67

Formátové specifikace formátovací řetězce

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13

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

Seminární práce z Teorie ICT

typová konverze typová inference

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

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

Sada 1 - Základy programování

1. Programování proti rozhraní

DUM 06 téma: Tvorba makra pomocí VBA

Paradigmata programování 1

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

Programování v C++ Úplnej úvod. Peta (maj@arcig.cz, SPR AG )

MQL4 COURSE. By Coders guru -4 Operace & Výrazy

Operátory. Základy programování 1 Martin Kauer (Tomáš Kühr)

Programovací jazyk. - norma PASCAL (1974) - implementace Turbo Pascal, Borland Pascal FreePascal Object Pascal (Delphi)

5a. Makra Visual Basic pro Microsoft Escel. Vytvořil Institut biostatistiky a analýz, Masarykova univerzita J. Kalina

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

LEKCE 6. Operátory. V této lekci najdete:

1 Základních pojmy z oblasti programování, vyšší programovací jazyky, programovací paradigmata

Úvod. Programovací paradigmata

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

DTP Základy programování Úvod do předmětu

Operátory. Základy programování 1 Tomáš Kühr

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

10 Balíčky, grafické znázornění tříd, základy zapozdření

Následující tabulka obsahuje typy objektů podle jejich pojmenovávání: počáteční písmeno jména

Masarykova střední škola zemědělská a Vyšší odborná škola, Opava, příspěvková organizace

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

Algoritmy I. Cvičení č. 2, 3 ALGI 2018/19

Úvod do programovacích jazyků (Java)

7. Datové typy v Javě

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

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.

Operátory, výrazy. Tomáš Pitner, upravil Marek Šabo

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

2 Datové typy v jazyce C

Algoritmizace prostorových úloh

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

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Ukázka knihy z internetového knihkupectví

Zápis programu v jazyce C#

Sada 1 - Základy programování

Přednáška 7. Celočíselná aritmetika. Návratový kód. Příkazy pro větvení výpočtu. Cykly. Předčasné ukončení cyklu.

Racionální čísla, operátory, výrazy, knihovní funkce

Algoritmizace a programování

Základní vzorce a funkce v tabulkovém procesoru

teorie logických spojek chápaných jako pravdivostní funkce

NPRG030 Programování I, 2016/17 1 / :58:13

Teorie. Hinty. kunck6am

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

První kapitola úvod do problematiky

IB111 Úvod do programování skrze Python Přednáška 13

4a. Makra Visual Basic pro Microsoft Excel Cyklické odkazy a iterace Makra funkce a metody

PB161 Programování v jazyce C++ Přednáška 9

Seminář Java II p.1/43

Da D to t v o é v ty t py IB111: Datové typy

Transkript:

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

Historie Alonzo Church (30. léta) Netypovaný lambda kalkul Základ prvních funkcionálních jazyků Jeho konstrukce i v mnoha současných programovacích jazycích (Python) Haskell Brooks Curry Kombinatorická logika jako variace lambda kalkulu Lambda výrazy nahrazeny omezenou sadou primitivních funkcí

John McCarthy Vytvořil programovací jazyk LISP Později velmi populární v oblasti umělé inteligence Common Lisp scriptovací jazyk pro něktré aplikace (Autocad) David Turner Jazyk Miranda První čistě funkcionální jazyk určený především pro komerční využití Jazyk Haskell Vytvořen zvláštním výborem v 80. letech Standard pro oblast funkcionálního programování

Lambda kalkul Teorie funkcí založená na velmi jednoduchém jazyce Záladní prvky tohoto jazyka (lanbda výrazy) Proměnná, aplikace, abstrakce Proměnná blíže nespecifikovaná hodnota (x,y,z) Aplikace volání funkce s jedním parametrem Funkce i argument jsou zadány jako lambda výrazy ve tvaru (e1 e2) Abstrakce reprezentace funkce tvořené proměnnou označující parametr a tělem ve tvaru lambda výrazu \ x e

Koncepty Higher-order funkce Čisté funkce Striktní, nestriktní a líné vyhodnocení

Higher-order funkce Můžou převzít nějakou funkci jako argument nebo navrátit funkci jako výsledek Derivace, neurčitý integrál, součin funkcí,... Důsledek toho, že funkcemi jsou entity první kategorie (First class) Funkce může vzniknout za běhu programu, být uložena v proměnné a předána jako argument jiné funkci

Čisté funkce Funkce bez vedlejších efektů Chování jednodušší na pochopení Pokud se výstup funkce nepoužívá, nemusí se volat Funkce lze vyhodnocovat v libovolném pořadí, nebo i paralelně Pokud mají dva výrazy stejné hodnoty, lze jeden dosadit za druhý

y = f(x) * f(x) Pokud je funkce f(x) čistá z = f(x) y = z*z Eliminuje se druhé vyhodnocení f(x)

Striktní vyhodnocení Argumenty funkce vyhodnoceny před jejím voláním Efektivní výpočet se provádí jednou f:=x^2+x+1 g:=x+y f(g(1,4)) f(g(1,4)) f(1+4) f(5) 5^2+5+1 31

Nestriktní vyhodnocení Méně efektivní Argumenty přenehány funkci nevyhodnocené Podporuje nekonečné datové struktury f:=x^2+x+1 g:=x+y f(g(1,4)) f(g(1,4)) g(1,4)^2+g(1,4)+1 (1+4)^2+(1+4)+1 5^2+5+1 31

Líné vyhodnocení Typ nestriktního vyhodnocení Argument není spočítán nikdy více než jednou Používán moderními čistě funkcionálními jazyky Miranda, Clean, Haskell

Seznamy Základní datové typy mnoha funkcionálních i logických jazyků Můžeme pomocí nich reprezentovat text jako seznam řádků a řádky jako seznamy slov nebo znaků

Haskell

Základní rysy Syntaxe napodobující matematický zápis Roli hraje i odsazení textu Statický typový systém Každý symbol má již v době překladu přidělen datový typ Automatické líné vyhodnocování

Implementace Existuje jen relativně malé množství překladačů Odkazy na ně na www.haskel.org Hugs Vhodný jako vývojový nastroj i pro začátečníky Běh aplikací je extrémně pomalý GHC Vhodný pro produkční prostředí Relativně rychlý

Operátory a funkce Funkce mají alfanumerické operátory a používají se prefixově Infixový zápis jen pokud jsou binární Musí být ve zpětných apostrofech mod 5 2 (prefix.) 5 `mod` 2 (infix.) Operátory obsahují pouze speciální znaky Používají se infixově prefixově nebo samostatně v závorkách 2+3 (infix.) (+) 2 3 (prefix.)

Priorita Při použití operátorů zohledněna priorita a asociativita Volání funkce má vyšší prioritu než jakýkoliv operátor Parametry funkcí se neuzavírají do závorek Závorky však mnohdy nutné pro zajistění správného pořadí vyhodnocení

sin 1 + 3 = (sin 1) + 3 funkce má vyšší prioritu než sčítání sin (1 + 3) = sin 4 zajištění priority vyhodnocení cos (sin 1) = cos sin 1 ~ (cos sin) 1 typová chyba

Case controlled language Nejen že rozeznává velikost písmen, ale dokonce má velikost písmen syntaktickou roli Identifikátory funkcí začínají malým písmenem Identifiátory typů začínají velkým písmenem Konstruktory nových hodnot začínají velkým písmenem (včetně nulárních konstant např. True)

Seznamy Homogenní (=položky stejného typu) Velikost není omezena Pořadí prvků je významné [1,2]!= [2,1] Speciální případ je seznam hodnot typu Char, který je ekvivalentem typu String Prázdný seznam [ ] Přidání prvku do seznamu (:) Připojí prvek zleva

Přidání prků do seznamu 1:2:3:4:5:[ ] [1,2,3,4,5] Zápis řetězce Buď ['l','a','m','b','d','a'] Nebo "lambda"

Struktura programu Na nejvyšší úrovni se program skládá z modulů Poskytují možnost opakovaného použití v nových projektech Jeden z modulů se musí jmenovat Main (funkce main) Určení, kde má výpočet začít Hlavička modulu může vypadat takto: module Sorting (quicksort, bubblesort, mergesort) where import Maybe import SortUtils hiding (merge)

Není nutné (ani obvyklé) uvádět středníky ukončující výraz Jejich funkci přebírá formátování vlastního kódu Kód který patří do jednoho bloku má stejné odsazení od začátku řádky Vnořený blok má odsazení větší otoc xs = obrat xs [] where obrat [] ys = ys obrat (x:xs) ys = obrat xs (x:ys) Pro odpůrce odsazování možno místo odsazení použít { }

qsort [ ] = [ ] setříděním prázdného seznamu dostaneme prázdný seznam qsort (x:xs) = qsort mensi ++ [x] ++ qsort vetsi_rovno výsledkem třídění seznamu, jehož první prvek je x a zbytek xs, je seznam, který vznikne spojením setříděného seznamu mensi, prvku x a setříděného seznamu vetsi_rovno where mensi = [ y y <- xs, y < x] Seznam mensi získáme ze seznamu xs výběrem takových prvků y, které jsou menší než x vetsi_rovno = [ y y <- xs, y >= x] Seznam vetsi_rovno získáme obdobně výběrem prvků větších nebo rovných x

Použité zdroje http://www.cs.vsb.cz/navrat/vyuka/flp/texty/fp/index.html http://makovice.nipax.cz/fel/obp/%23prednasky/x36obp-functional.pdf http://ithil.ujep.cz/workspace/haskell.pdf http://cs.wikipedia.org/wiki/funkcion%c3%a1ln%c3%ad_programov%c3 http://www.root.cz/clanky/haskell-a-funkcionalni-programovani/

Děkuji za pozornost