Funkcionální programování v praxi. Tomáš Petříček http://tomasp.net/blog tomas@tomasp.net



Podobné dokumenty
Reaktivní programování v.net

1. Programování, typy programovacích jazyků, historie.

Virtuální přístroje. Použití grafického programování v LabVIEW. Ing. Pavel Mlejnek

Jazyk C# (seminář 6)

Nerovnice s absolutní hodnotou

1 - Úvod do platformy.net. IW5 - Programování v.net a C#

Python. Zdeněk Philipp - Seznam.cz

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář

Syntaxí řízený překlad

PRG036 Technologie XML

Název: VY_32_INOVACE_PG3309 Booleovské objekty ve 3DS Max - sčítání a odčítání objektů

Jazyk C# (seminář 5)

Střední průmyslová škola strojnická Olomouc, tř.17. listopadu 49

PREPROCESOR POKRAČOVÁNÍ

Operační systém teoreticky

Kolekce ArrayList. Deklarace proměnných. Import. Vytvoření prázdné kolekce. napsal Pajclín

PL/SQL. Jazyk SQL je jazykem deklarativním, který neobsahuje procedurální příkazy jako jsou cykly, podmínky, procedury, funkce, atd.

Plán předmětu Název předmětu: Školní rok: Ročník: Semestr: Typ předmětu: Rozsah předmětu: Počet kreditů: Přednášející: Cvičící: Cíl předmětu

Windows 10 (6. třída)

Třídy a objekty -příklady

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

2.8.9 Parametrické rovnice a nerovnice s absolutní hodnotou

Úvod do programovacích jazyků (Java)

V týmové spolupráci jsou komentáře nezbytností. V komentářích se může např. kolega vyjadřovat k textu, který jsme napsali atd.

Inovace výuky prostřednictvím šablon pro SŠ

Vrtání závitů bez vyrovnávací hlavičky (G331, G332)

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

16. února 2015, Brno Připravil: David Procházka

{ } Kombinace II. Předpoklady: =. Vypiš všechny dvoučlenné kombinace sestavené z těchto pěti prvků. Urči počet kombinací pomocí vzorce.

Teoretické minimum z PJV

Novinky v Maple T.A. 10

Programování v Javě I. Leden 2008

( ) Kreslení grafů funkcí metodou dělení definičního oboru I. Předpoklady: 2401, 2208

BlueJ a základy OOP. Programování II 1. cvičení Alena Buchalcevová

Používání IS Carsystem

Programovací jazyk Haskell

MS WORD 2007 Styly a automatické vytvoření obsahu

Vektorový grafický editor

OOPR_05. Případové studie

Sada 2 - MS Office, Excel

První kapitola úvod do problematiky

Pokročilé schopnosti OOP

Programování v Javě I. Únor 2009

Programovací í jazyk Haskell

Novinky ve Visual Studio Tomáš Kroupa

Poznámky k verzi. Scania Diagnos & Programmer 3, verze 2.27

Kalendář je nástroj, který vám pomůže zorganizovat si pracovní čas. Zaznamenáváme do něj události jako schůzky, termíny odevzdání práce a podobně.

Abstraktní datové typy: zásobník

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Přehled probírané látky

Příklady a návody. Databázová vrstva

5 Rekurze a zásobník. Rekurzivní volání metody

Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec. Programování v C# Soubory a regulární výrazy. Petr Vaněček 1 / 27

DUM 13 téma: Příkazy pro výběr

Současné trendy vývoje aplikací pro platformu ios

Programování II 1. přednáška. Alena Buchalcevová

Gymnázium Vysoké Mýto nám. Vaňorného 163, Vysoké Mýto

Jak stáhnout video/hudbu z YouTube. Napsal uživatel Yeah(c) Neděle, 15 Listopad :44

Allegro 1.92 release ( od )

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Abstrakt. Následující text obsahuje detailní popis algoritmu Minimax, který se používá při realizaci rozhodování

Návod k použití vigilančních formulářů

Algoritmizace a programování

1.1.1 Kvadratické rovnice (dosazení do vzorce) I

2.7.2 Mocninné funkce se záporným celým mocnitelem

EZB dělí časopisy dle dostupnosti do 4 kategorií označené symboly: - volně dostupné. - předplacené tituly dostupné v rámci knihovny

Pohyb v listu. Řady a posloupnosti

Vladimír

Poznámky k verzi Remote Support Platform 3.0

PostgreSQL. Podpora dědičnosti Rozšiřitelnost vlastní datové typy. Univerzální nasazení ve vědecké sféře

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.

PŘÍLOHA č. 2B PŘÍRUČKA IS KP14+ PRO OPTP - ŽÁDOST O ZMĚNU

20. Projekt Domácí mediotéka

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

ZÁKLADY PROGRAMOVÁNÍ. Mgr. Vladislav BEDNÁŘ , 5.1 a 5.2 8/14

Uplatnění nových informačních technologií ve výuce a na zdravotnickém pracovišti. Marie Marková

Poruchy modul pro rychlé hlášení poruch z provozu.

CERTIFIKOVANÉ TESTOVÁNÍ (CT) Výběrové šetření výsledků žáků 2014

PROGRAMOVÁNÍ V C++ CVIČENÍ

Historie počítačů v kostce. Marek Kocián, KOC322 Daniel Kapča, KAP077

této složky Hodnoty c) klepnutím na Smazání Typ hodnot

Lokální a globální extrémy funkcí jedné reálné proměnné

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

Práce se zálohovými fakturami

PARA Filozofové, kuřáci a holič

Sada 2 CAD CADKON 2D 2011 Nosníkový strop

JavaScript v praxi: Sokoban (5. přednáška)

DJ2 rekurze v SQL. slajdy k přednášce NDBI001. Jaroslav Pokorný

LISP Definice funkcí

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

IMPORT A EXPORT MODULŮ V PROSTŘEDÍ MOODLE

Infor Performance management. Eva Janečková Jakub Urbášek

Seminář z IVT Algoritmizace. Slovanské gymnázium Olomouc Tomáš Kühr

1.3.1 Kruhový pohyb. Předpoklady: 1105

RMI Remote Method Invocation

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

Signály Mgr. Josef Horálek

STRUKTUROVANÉ UČENÍ. Příklady vzdělávací práce u žáků s poruchami autistického spektra v naší škole

Zvyšování IT gramotnosti zaměstnanců vybraných fakult MU MS POWERPOINT 2010

Webové služby a XML. Obsah přednášky. Co jsou to webové služby. Co jsou to webové služby. Webové služby a XML

Transkript:

Funkcionální programování v praxi Tomáš Petříček http://tomasp.net/blog tomas@tomasp.net

Funkcionální programování v praxi» Možná více, než si myslíte Lze o tom napsat (a prodávat) knihy» V ne-funkcionálních jazycích Microsoft C# 3.0 a projekt LINQ Parallel Extensions for.net Některé vlasntosti v Pythonu Nový standard C++ 0x» Moderní funckionální jazyky Clojure LISP-style jazyk pro JVM Scala kombinace objektů a funkcionálního programování F# Jazyk pro.net, vychází z ML respektive OCaml

Microsoft Visual F#» Programovací jazyk ve Visual Studiu 2010 Autorem je Don Syme z Microsoft Research, Cambridge Funkcionální aspekty Programujeme skládáním výrazu Vypočítáváme výsledek programu (jako matematika) Objektově orientované aspekty Plná podpora pro objektový model.net jazyků Lze používat.net z F# a naopak F# z.netu Podporuje interaktivní programování Interaktivní testování kódu při jeho psaní Začneme jednoduše, postupně upravujeme Umožňuje některé imperativní konstrukce Užitečné pro optimalizace a pro interoperability

Rychlý přehled jazyka F# a používání.net knihoven z F#

Deklarace hodnot pomocí let» Immutable hodnota se nemění let num = 10 num = 11 Returns false» Type inference typy známé za překladu! let str = "Hello world!" let stock = ("MSFT", 25) let nums = [1; 2; 3; 4] Value: string» Unified funkce jsou také hodnoty Tuple: string * int List: int list let twotimes num = num * 2 Function type: int -> int

Funkce, rekurze a abstrakce» Vytváříme nové hodnoty, místo modifikace Cykly lze zapsat pomocí rekurzivních volání» Nechceme opakovat podobné rekurizvní vzory Rekurzivní kód můžeme parametrizovat Higher-order functions berou funkci jako parametr» Mnoho takových funkcí už je k dipozici Například pro práci se základními datovými typy Nejčastěji je píšeme při deklaraci vlastního typu

Práce s datovým typem záznam» Deklarace typu určuje (immutable) položky type Rect = { Left : float32 Top : float32 Width : float32 Height : float32 }» Funkce pro práci se záznamem Může například vytvořit nový seznam a vrátit jej let deflate rc wspace hspace = { Top = rc.top + wspace Left = rc.left + hspace Width = rc.width - (2.0f * wspace) Height = rc.height - (2.0f * hspace) }

Objektově orientované aspekty» OOP je způsob organizace kódu, nic jiného! Připojení související funkcionality k typu/objektu Pojmenovává this type Rect = { Left : float32 Top : float32 Width : float32 Height : float32 } Obvyklá deklarace typu v F# K typu připojujeme deklarace členů member x.deflate(wspace, hspace) = { Top = x.top + wspace Left = x.left + hspace Width = x.width - (2.0f * wspace) Height = x.height - (2.0f * hspace) } Zkompiluje se jako normální.net metoda Funkcionální chování!

Používání.NET typů» Lze používat všechny typy, bez omezení Není třeba žádný explicitní import F# je.net jazyk Operátor <- přiřazuje hodnotu vlastnosti Operátor. přistupuje ke členům objektu Jeden zápis main fce. open System open System.Windows.Forms.NET atributy [<STAThread>] do let form = new Form(Width = 400, Height = 300) form.text <- "Hello World Form Application.Run(form) Import.NET namespaces Zadání hodnoty vlastnosti již při vytváření objektu Modifikace vlastnosti

Demo 3D fraktál pomocí WPF

Reaktivní programování v F#

Práce s událostmi» Událost může se stát, nese nějaký argument MouseMove při pohybu myší, obsahuje X a Y kurzoru» Běžný způsob práce s událostmi v.net Pomocí registrace callback funkce Je zavolána systémem v případě události let w1 = new FileSystemWatcher ("C:\\Temp", EnableRaisingEvents = true) w1.renamed.add(fun fse -> Callback funkce if isnothidden(fse) then printfn "%s renamed to %s" fse.oldfullpath fse.fullpath)

Práce s událostmi, lépe» Kdybychom měli seznam objektů, místo události: Vytváříme seznam let infos = renamedinfos > List.filter isnothidden > List.map formatfileevent Pouze viditelné soubory Místo informací o souboru vracíme řetězec» Podobné funkce existují i pro události! Vytváříme novou událost let renamedinfoevent = w.renamed > Observable.filter isnothidden > Observable.map formatfileevent Deklarativně popíšeme jaké události nás zajímají Imperativní callback až na koncovou událost

Demo Počítání kliknutí na tlačítka Increment Decrement map (always 1) map (always -1) merge scan (+) 0 listen ( )

Computation expressions» Skládání výpočtů uživatelsky-definovaným způsobem <builder> { let! arg = function1() let! res = function2(arg) return res }» Význam je specifikovaný objektem <builder> Například, můžeme automaticky propagovat null hodnoty (neboli Maybe monad v jazyce Haskell) let LoadFirstOrder(customerId) = nullable { let! customer = LoadCustomer(customerId) let! order = customer.orders.firstordefault() return order }

Asynchronous workflows» Použití předcházejícího zápisu pro psaní dlouhoběžících operací které neblokují vlákna let http(url:string) = async { let req = HttpWebRequest.Create(url) let! rsp = req.asyncgetresponse() let reader = new StreamReader(rsp.GetResponseStream()) return! reader.asyncreadtoend() } let pages = Async.Parallel [ http(url1); http(url2) ]» Vhodné pro různé způsoby paralellního programování Fork/Join paralelismus s I/O operacemi Aktivní objekty komunikující pomocí zpráv

Počítání kliknutí na formulář» Progam zapisujeme pomocí agentů Agent většinu času pouze čeká, pak rychle reaguje Bere parametr int a vytváři objekt Async<unit> Výpočet bude pokračovat po kliknutí let rec loop(count) = async { let! me = Reactive.AwaitEvent(lbl.MouseDown) let add = if me.button = MouseButtons.Left then 1 else 0 lbl.text <- sprintf "Clicks: %d" (count + add) return! loop(count + add) } Rekurzivní volání loop(0) > Async.Start» To vypadá podobně jako Observable.scan Ne vždy máme ale tak jednoduché chování...

Počítání kliknutí na formulář» Progam zapisujeme pomocí agentů Agent většinu času pouze čeká, pak rychle reaguje let rec loop(count) = async { let! me = Reactive.AwaitEvent(lbl.MouseDown) let add = if me.button = MouseButtons.Left then 1 else 0 lbl.text <- sprintf "Clicks: %d" (count + add) let! _ = Reactive.Sleep(1000) return! loop(count + add) } loop(0) > Async.Start Výpočet bude pokračovat za 1000ms» Toto již pomocí Observable.scan (snadno) nejde

Demo Aplikace na kreslení obdélníků Starting Initial state Waiting MouseMove (button released) MouseDown Drawing MouseMove (with button pushed)

Reprezentace dat pomocí F# typů

Datové typy v F#» Vytváříme složitější typy z jednoduchých Založené na principu compositionality 1) Několik základních typů pro začátek 2) Několik způsobů pro konstrukci typů» Základní typy: int, string, float,» Typové konstruktory: _ * _ Vytváří n-tici (na příklad string * int) list<_> Vytváří seznam (na příklad list<int>)» Typove konstruktory lze libovolně vnořovat Na příklad list<int * string> nebo string * list<int>

Demo Popisování finančních kontraktů pomocí datových typů v F#

Díky za pozornost!?» Mail: tomas@tomasp.net» Blog: http://tomasp.net/blog