Tomáš Petříček Microsoft C# MVP

Slides:



Advertisements
Podobné prezentace
Využití cloudových služeb ve školství
Advertisements

Pro začátek něco lehčího
Vstup a výstup Ing. Lumír Návrat  katedra informatiky, A-1018 
ŘÍDÍCÍ STRUKTURY - PODMÍNKY
Dynamické dokumenty na straně klienta Informatika pro ekonomy II.
Vstup a výstup doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007 
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 –
Uživatelem definované typy doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007 
Programování v Pascalu Přednáška 5 RNDr. Hana Havelková.
Práce se soubory. Ukládání dat Textové soubory s jednoduchou strukturou (např..txt a.csv) textové soubory s vnitřní hierarchií (např..xml) Soubory binárního.
C# pro začátečníky Mgr. Jaromír Osčádal
Principy překladačů Mezikód Jakub Yaghob.
Programovací jazyk Haskell Ing. Lumír Návrat  katedra informatiky, A 1018 
PROGRAMOVACÍ JAZYKY (c) Tralvex Yeap. All Rights Reserved.
SQL Lukáš Masopust Historie  Předchůdcem databází byly papírové kartotéky  děrný štítek  1959 konference  1960 – vytvořen jazyk COBOL.
SQL Lukáš Masopust Historie  Předchůdcem databází byly papírové kartotéky  děrný štítek  1959 konference  1960 – vytvořen jazyk COBOL.
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.
J a v a Začínáme programovat Lucie Žoltá Přetěžování metod, rekurze.
Procedury a funkce Základní charakteristika a použití v programu.
Vyučovací hodina 1 vyučovací hodina: Opakování z minulé hodiny 5 min Nová látka 20 min Procvičení nové látky 15 min Shrnutí 5 min 2 vyučovací hodiny: Opakování.
OSNOVA: a) Řetězce v C b) Funkce stdio.h pro řetězce c) Funkce string.h pro řetězce d) Příklad Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače.
Školení správců II. Petr Pinkas RNDr. Vít Ochozka.
A1PRG - Programování – Seminář Ing. Michal Operátory (2. část) 4 Verze
Softwareová architektura
PB161 – Programování v jazyce C++ Objektově Orientované Programování
Objektové programování
Datové typy a práce s nimi
A1PRG - Programování – Seminář Ing. Michal Ukazatele a pole 10 Verze
Počítače a programování 1
A1PRG - Programování – Seminář Ing. Michal Standardní knihovní funkce pro vstup a výstup 12 Verze
C# - předávání parametrů Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí.
IB111 Programování a algoritmizace
Architektury a techniky DS Cvičení č. 9 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Objektově orientované programování - cvičení 1
12/04/20151 Kolekce (1) Kolekce (collection) představují standardní datové struktury (seskupení) prvků (objektů) Jsou definovány ve jmenném prostoru System.Collections.
Metodologie OOHDM, jazyk Lua a tvorba webových aplikací
2 UDÁLOSTI ONMOUSEOVER, ONMOUSEOUT Odkaz Událost je část kódu vyvolana za určité (uživatelem vyvolané) situace (kliknutí myší, přejetím kurzorem myši,
Programovací jazyk Haskell doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007 
1 / 9X36DSA 2005The complexity of different algorithms varies: O(n), Ω(n 2 ), Θ(n·log 2 (n)), … Různé algoritmy mají různou složitost: O(n), Ω(n 2 ), Θ(n·log.
Gymnázium, Obchodní akademie a Jazyková škola s právem státní jazykové zkoušky Hodonín Úvod do programování.
XQuery Dotazovací jazyk XML Daniel Privalenkov. O čem bude prezentace Nutnost dotazovacího jazyku v XML Rychlý přehled XQuery Několik příkladů.
Uživatelem definované typy Ing. Lumír Návrat  katedra informatiky, A 1018 
Jazyky pro umělou inteligenci RNDr. Jiří Dvořák, CSc.
Seznamy v jazyce Haskell Ing. Lumír Návrat  katedra informatiky, D-403 
Pokročilé programování v C++ (část B)
Jazyk C A0B36PRI - PROGRAMOVÁNÍ Část I.
Kam se ubírá jazyk C#? Dr. Ing. Dalibor Kačmář Academic Developer Evangelist Developer & Platform Evangelist Group Microsoft Czech & Slovakia Anders Hejlsberg.
České vysoké učení technické Fakulta elektrotechnická Datové typy, výrazy vstup, výstup Jazyk JAVA A0B36PRI - PROGRAMOVÁN Í v1.02.
Úvod do UNIXu (6th round)
Vícerozměrná pole (1) Jazyk C povoluje, aby pole mělo více rozměrů (dimenzí) než jeden Z vícerozměrných polí bývá nejčastěji použí-váno pole dvourozměrné.
23/04/20151 LINQ (1) LINQ (Language Integrated Query) je součást MS.NET Frameworku umožňující jednotný přístup k datům a jejich zpracování deklarativ-
Podprogramy (subroutines) Pojmenované kousky programu, které –tvoří logicky ucelené části –se v programu opakují Jsou zapsány na jednom místě a v případě.
IB111 Programování a algoritmizace
Překladače 1. Překladače a programovací jazyky © Milan Keršlágerhttp:// Obsah:
NÁZEV ŠKOLY: S0Š Net Office, spol. s r.o., Orlová-Lutyně AUTOR: Ing. Adéla Tomalová NÁZEV: Podpora výuky v technických oborech TEMA: Objektově orientované.
DidactIG 2016STRANA 1 Možné přístupy k výuce dětských programovacích jazyků Jindra Drábková Katedra aplikované matematiky FP TUL.
Moduly.
Programovací jazyk C# 4. část - cykly.
NÁZEV ŠKOLY: Střední odborná škola Net Office, spol. s r. o
Jakub Brodský Ondřej Radosta
Ruby on Rails framework vývoj aplikací pro WWW
Návrhový vzor Flyweight
Moderní didaktické technologie a zdroje informací
TNPW1 JavaScript Ing. Jiří Štěpánek.
Databázové systémy a SQL
Oblast platnosti identifikátoru (1)
Programovací jazyk Haskell
Podprogramy.
C# přehled vlastností.
Transkript prezentace:

Tomáš Petříček Microsoft C# MVP http://www.tomasp.net The F# language Tomáš Petříček Microsoft C# MVP http://www.tomasp.net

Co je F# vlastně zač? Plnohodnotný programovací jazyk pro .NET Lze používat libovolné .NET knihovny Lze vytvářet knihovny použitelné z jiných jazyků Umožňuje kombinovat několik přístupů Objektově orientované programování Funkcionální programování Vhodný pro (interaktivní) skriptování

Čím je F# zajímavý? Funkcionální programování je obecný koncept Některé idiomy lze použít v libovolných jazycích Zajímá vás co nás čeká za pár let? Některé myšlenky z F# se mohou objevit i v jiných jazycích Jazyk vzniká v Microsoft Research Licence umožňuje komerční využití F# je používaný (testovaný) a optimalizovaný Díky .NETu lze F# použít v části projektu Na některé úkoly se to vyplatí

Proč vymýšlet něco nového? Programy jsou těžko paralelizovatelné A když už tak se chovají nedeterministicky Některé myšlenky lze těžko vyjádřit Deklarativní zápis je mnohem čitelnější a kratší V OOP lze vytvářet znovupoužitelné třídy Vyjádřit znovupoužitelnou funkci není tak snadné Je nutné používat více jazyků v jednom projektu A občas není možnost volby

Agenda Funkcionální programování v F# Užitečné funkcionální idiomy Interaktivní skriptování Interoperabilita mezi F# a jinými .NET jazyky F# jako jazyk pro ASP.NET Metaprogramování v F#

Typový systém Typová bezpečnost (stejně jako C#) Většinou ale není potřeba typ psát Odvozuje typy z kontextu (type inference) Využívá typové parametry (generics v .NET 2.0) // Hodnota celočíselného typu (int) let n = 42 // Hodnota typu řetězec (string) let str = "Hello world!" // Funkce (int -> int) let add10(n) = n + 10 // Funkce - vrací parametr ('a -> 'a) let id(sth) = sth

To není pro programátory, kteří znají C# 2.0 nic nového! Typový systém To není pro programátory, kteří znají C# 2.0 nic nového! Funkce je typ jako každý jiný Lze ji předávat jako parametr a vracet jako výsledek Lze ji vytvářet kdekoliv v kódu // Funkce (int -> int) let add10_a(n) = n + 10 // Ekvivalentní funkce (int -> int) let add10_b = fun n -> n + 10 // Funkce bere jako parametr funkci // Typ: (int -> int -> int) -> int let volani(func) = 1 + func 2 3 // Předání funkce jako parametru volani(fun a b -> a + b)

Typový systém Discriminated union To lze vyjádřit v OOP následujícím způsobem: // Datový typ může obsahovat jednu z následujících variant type simple_expr = | Num of int | Add of simple_expr * simple_expr | Sub of simple_expr * simple_expr simple_expr simple_expr.Num simple_expr.Add simple_expr.Sub value : int value1 : simple_expr Value2 : simple_expr value1 : simple_expr Value2 : simple_expr

Demo Typový systém F# Typová bezpečnost a funkce Srovnani quicksortu v F# a C# Web crawler Typový systém F# Typová bezpečnost a funkce Discriminated union & pattern matching

Typový systém Tuple – n-tice prvků různého typu List – seznam prvků stejného typu F# umí pracovat i s .NET kompatibilním polem // Dvojice (int * string) let tup = (1, “Hello world!”) // Funkce pracující s dvojící let func tup = let (n, s) = tup // ... // Seznam čísel (int list) let list = [1; 2; 3; 4; 5] // Reprezentace seznamu type int_list = | Nil | Cons of int * int_list

Funkcionální vs. imperativní Imperativní přístup Založený na přiřazování hodnot proměnným Funkcionální přístup Založený na rekurzi Hodnota „proměnných“ se nemění (immutable values) Čistě funkcionální kód nemá vedlejší efekty Víte kde jsou neměnné hodnoty použité v .NETu? // Volání funkcí bez vedlejších efektů let v1 = funkce1(10) let v2 = funkce2(20) funkce3(v1,v2)

Funkcionální vs. imperativní V F# lze oba přístupy kombinovat Pro spolupráci s .NETem je imperativní přístup nutný Funkcionální přístup Imperativní přístup // Faktoriál (funkcionální přístup) let rec fac_f n = if (n = 0) then 1 else n * fac_f(n – 1) // Faktoriál (imperativní přístup) let fac_i n = let ret = ref 1 for i = 1 to n do ret := !ret * i done !ret

Demo Funkcionální programování v akci Srovnani quicksortu v F# a C# Web crawler Funkcionální programování v akci Zápis algoritmu QuickSort (F# vs. C#) Web crawler

Agenda Funkcionální programování v F# Užitečné funkcionální idiomy Interoperabilita mezi F# a jinými .NET jazyky Interaktivní skriptování F# jako jazyk pro ASP.NET Metaprogramování v F#

Pár zajímavých idiomů z FP Funkce map (Select), filter (Where) a foldl let list = [0; 1; 2; 3; 4; 5; 6; 7; 8; 9] // Filter a map // result = [0; 9; 36; 81] let result = list |> List.filter ( fun n -> n%3 = 0) |> List.map ( fun n -> n*n ) // Foldl // sum = 126 let sum = result |> List.fold_left ( fun acc v -> acc + v ) 0

Pár zajímavých idiomů z FP Delegáty nahrazují parametr typu funkce Funkce Iter a Map vypadají podobně public delegate T Func<A0, T>(A0 arg0); public delegate T Func<A0, A1, T>(A0 arg0, A1 arg1); // Vybere prvky pro které ‘filterFunc’ vrací true public IEnumerable<T> Filter<T> (IEnumerable<T> e, Func<T, bool> filterFunc) { foreach(T el in e) if (filterFunc(el)) yield return el; } // Postupně akumuluje výsledek pomocí ‘accFunc’ public R FoldLeft<T, R>(IEnumerable<T> en, Func<R,T,R> accFunc, R init) { R ret = init; foreach(T el in en) ret = accFunc(ret, el); return ret;

Demo Idiomy funkcionálního programování Map, Filter a FoldLeft v C#

Pár zajímavých idiomů z FP Kde je líné vyhodnocování použité v .NETu? Líné vyhodnocování Odložení výpočtu až na dobu kdy je potřeba výsledek let a = Lazy.lazy_from_func ( fun () -> (* výpočet *) 42 ) let b = Lazy.lazy_from_func ( fun () -> (* výpočet *) 84 ) let func (x:Lazy<int>) (y:Lazy<int>) = // výpočet... if (use_x_value) then Lazy.force x else Lazy.force y // Volání funkce func func a b

Demo Idiomy funkcionálního programování Líné vyhodnocování – třída Lazy<T>

Agenda Funkcionální programování v F# Užitečné funkcionální idiomy Interaktivní skriptování Interoperabilita mezi F# a jinými .NET jazyky F# jako jazyk pro ASP.NET Metaprogramování v F#

Interaktivní skriptování Používané pro správu nebo v matematických aplikacích Cmd, Bash, PowerShell Uživatel postupně zadává příkazy Typicky interpretovaný skriptovací jazyk F# je ale samozřejmě kompilované Jaké jsou důležité požadavky? Kód musí být co nejjednodušší

DEMO Interaktivní skriptování v F# Slavná matematická simulace v DirectX

Agenda Funkcionální programování v F# Užitečné funkcionální idiomy Interaktivní skriptování Interoperabilita mezi F# a jinými .NET jazyky F# jako jazyk pro ASP.NET Metaprogramování v F#

Použití .NET objektů V F# lze používat objekty z .NETu Operátor “<-” pro přiřazování do vlastností Operátor “.” na volání metod, vlastností // import .NET namespaců open System open System.Windows.Forms // .NET atributy [<STAThread>] let main() = // Vytvoření formuláře a nastavení vlastností let form = new Form() form.Width <- 400 form.Height <- 300 form.Text <- "Hello World Form“ Application.Run(form) do main()

Export funkcí z F# Funkce jsou exportovány jako statické metody Pomocí module lze určit jméno třídy Složitější to je s různými F# datovými typy Viz následující ukázka namespace MyFSharp.Export module Math = begin let rec factorial n = if (n = 0) then 1 else n * (factorial (n-1)) end

Objekty v jazyce F# Umí vše co je potřeba pro spoluprácí s .NET jazyky Viditelnost je (zatím) určena „hlavičkovým“ souborem type Customer = class val name:String val mutable income:int new(n,a) = { name = n; income=10000 } override this.ToString() = String.Format("(Name={0}, Income={2})", this.name, this.income); member this.Income with get() = this.income and set(v) = this.income <- v member this.Name with get() = this.name end

DEMO Interoperabilita mezi F# a jinými .NET jazyky Windows Forms aplikace v F# Práce s F# třídami a funkcemi z C#

Agenda Funkcionální programování v F# Užitečné funkcionální idiomy Interaktivní skriptování Interoperabilita mezi F# a jinými .NET jazyky F# jako jazyk pro ASP.NET Metaprogramování v F#

F# jako jazyk pro ASP.NET Dvě možnosti V F# lze psát code-behind třídy pro ASP.NET stránky V F# lze psát celý web Rozšiřitelnost ASP.NET Lze (snadno) přidat podporu pro jakýkoliv jazyk Používá se CodeDomProvider Ke generování zdrojových kódů z ASPX/ASCX souborů Ke kompilování vygenerovaných zdrojáků

DEMO ASP.NET web v jazyce F# Ukázková webová aplikace

Agenda Funkcionální programování v F# Interoperabilita mezi F# a jinými .NET jazyky Interaktivní skriptování F# jako jazyk pro ASP.NET Metaprogramování v F#

To také už známe! (Nápověda: C# 3.0 a LINQ) Metaprogramování v F# Psaní programů, které generují nebo pracují s programy (nebo sami se sebou) jako s daty Co to znamená? V programu lze část kódu označit jako data Kód ale musí být korektní kód jazyka F# K čemu je to dobré? Kód lze analyzovat Kód lze překládat do jiného jazyka To také už známe! (Nápověda: C# 3.0 a LINQ)

Metaprogramování v F# Program je reprezentovaný jako stromová struktura >> <@ 1 + 2 * 4 @> > val it : expr = <@ > Microsoft.FSharp.MLLib.Pervasives.op_Addition (Int32 1) > Microsoft.FSharp.MLLib.Pervasives.op_Multiply (Int32 2) (Int32 4)) > @> op_Addition (Int32 1) op_Multiply (Int32 2) (Int32 4)

F# a projekt LINQ Kód napsaný v F# lze překládat do jiných jazyků Například do jazyka SQL! Překládají se výrazy použité pro filtrování, projekci atd. Pozn.: Operátor “|>” má význam zřetězení – postupně se provedou všechny operace v řetězci // Northwind je objekt vygenerovaný nástroji z LINQ projektu let db = new nwind.Northwind ("Database=Northwind;Server=.;Integrated Security=SSPI") // Databázový dotaz v F# let query = db.Customers |> where <@ fun c -> c.Country="USA" @> |> select <@ fun c -> (c.CompanyName, c.City, c.Country) @>

Demo Metaprogramování Jednoduchá ukázka FLINQ a práce s databází v F#

Demo Metaprogramování Překlad z F# do JavaScriptu

Kde se F# používá? V Microsoftu V Microsoft Research Jinde... Verifikátor ovladačů (práce s kódem) V Microsoft Research Strojové dokazování Analýza vícevláknových aplikací V týmu, který se zabývá hrami Jinde... Finanční instituce – analýza dat

Další zdroje informací Oficiální web F# http://research.microsoft.com/projects/fsharp/ Komunitní web stránka o F# http://cs.hubfs.net/ Don Syme’s blog – blog autora http://blogs.msdn.com/dsyme Funkcionální programování obecně: http://www.defmacro.org/ramblings/fp.html