Functioneel Programmeren Daan Leijen. Wat gaan we doen? 3 fundamentele principes van computatie Equationeel redeneren IO-monad GUI's in Haskell (wxHaskell)

Slides:



Advertisements
Verwante presentaties

Advertisements


Bij een herhaald experiment, met telkens dezelfde kans op succes gebruiken we de binomiale kansverdeling Een binomiale kansverdeling wordt gekenmerkt door.
Lees- en Taalproblemen
Informatieverwerkende systemen
Snelheid.
Lijsten in de -calculus Een lijst [E 1, E 2,..., E n ] kan in de -calculus voorgesteld worden als z.((z E 1 ) z.((z E 2 )... z.((z E n ) nil)...) met nil.
Deel I: Functionele Programmeertalen Hoofdstuk 4: Functioneel Programmeren.
Uitwerking tentamen Functioneel Programmeren 29 januari 2009.
Practica Computerlinguistiek Tekst en uitleg:
HOE MOET JE GELDIG STEMMEN?
Het vergelijken van twee populatiegemiddelden: Student’s t-toets
Hogere-ordefuncties nEen lijst langs lopen en met elk element iets doen nEen lijst langs lopen en sommige elementen selecteren map filter.
Excel, zin in een potje Zeeslag?
Reductiemachine Functionele talen en dus de -calculus, worden vaak geïmplementeerd door een reductiemachine. De elementaire stap is een reductie, en de.
Polymorf zoeken zoek :: (a  a  Bool)  [ (a, b) ]  a  b zoek eq [ ] x = ??? zoek eq ((a,b):ts) x | eq a x = b | otherwise = zoek eq ts x MayBe b No.
1 Datastructuren Sorteren: alleen of niet alleen vergelijkingen College 5.
Hogere-orde functies: herhaald patroon? Parametrizeer! product :: [Int]  Int product [ ]= product (x:xs)= 1 product xs x * and :: [Bool]  Bool and [
Hoger-ordefuncties op lijsten nDoorloop een lijst en... map :: (a  b)  [a]  [b] filter :: (a  Bool)  [a]  [a] foldr :: (a  a  a)  a  [a]  a.
Het binaire talstelsel
Presentatie vergelijkingen oplossen Deel 2
Bewegen Hoofdstuk 3 Beweging Ing. J. van de Worp.
Numerieke Natuurkunde
-calculus.
Algoritmen en Datastructuren (ALDAT) EVMINX4 Week 6.
Functies definiëren nDoor combinatie van standaardfuncties fac :: Int  Int fac n = product [1..n] oneven :: Int  Bool oneven n = not (even n) negatief.
Char en String nCharéén letter uord ::Char  Int uchr ::Int  Char nString[Char] uwords :: String  [String] uunwords :: [String]  String ”hoi” ”CKI”
Hogere-ordefuncties nVoeg de elementen van een lijst samen nCombineer twee functies foldr :: (a  b  b)  b  [a]  b [a] (.) :: (b  c)  (a  b)  a.
Reguliere talen nReguliere grammatica: versimpelde Contextvrije grammatica nFinite-state Automaton: andere manier om een taal te beschrijven nReguliere.
Opg.1a: substring } String substring(int a) { int t; for (t=a; t
Imperatief programmeren nProgramma bestaat uit nRunnen is opdrachten gegroepeerd in methoden één voor één uitvoeren te beginnen met main.
Hogere Wiskunde Rijen en Reeksen Sommeren College week 3
Hogere wiskunde Limieten college week 4
Consoletoepassing Variabelen Klassen
Algoritmiek Object-georiënteerd Programmeren
Les 2 groep 8 leerdoel: Je kunt werken met een verhoudingstabel.
LauwersCollege Buitenpost Java Applet programma dat op een website zichtbaar is Java Application programma dat zelfstandig werkt Javascript Scripttaal.
Opgave 1a: void nvoid staat in de header van een methode die geen resultaatwaarde heeft nde aanroep van een void-methode is dan een opdracht i.p.v. een.
Hoofdstuk 9 havo KWADRATEN EN LETTERS
Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 3: Werken met numerieke gegevens.
ware bewering niet ware bewering open bewering
Hoofdstuk 4: Statistiek
Heel kleine getallen.
Neurale Netwerken Genetische Algorithmen
Het gebruik van FP op een meeloopdag voor middelbare scholieren Paul de Mast.
Tircms03-p les 2 Hfdst 3,4 Meer operatoren Functies.
Tentamen vraag 1 Als L en M talen zijn, dan nL  M is gelijk aan { s  t | s  L, t  M } nL M is gelijk aan { s t | s  L, t  M } nL n is gelijk aan.
Tircms02-p les 3 Functies Strings Structuren. Functies 1. main() 2. { int k; k = 10 ; printf(“%d\n”,fac(k)); } 3. int fac(n) int n; 4. { int f; f= 1;
Les 1: Zaterdag 10 mei 2014 Wim Peeters
PROGRAMMEREN LOGISCH en FUNCTIONEEL Ik zeg wat ik denk!
Functioneel programmeren Een snelle herhaling…. Functie-definitie static int kwad (int x) { return x*x ; } kwad x = x * x Haskell kwad :: Int  Int.
Vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 Onderwerpen voor vandaag top-down decompositie Opdrachten:
(S)DT Haskell Deel 2 list comprehensions, types en type klassen, programma transformatie, I/O.
Instructie Programmeren Task 4 5JJ70. Task 4.1: Iteratief proces Het doel van de opdracht is de uitgangsspanning van een transistor te bepalen met de.
Instructie Programmeren Task 7
Les 0 Structured Query Language SQL. Programma Les 0 – Introductieopdracht Les 1 Les 2 Les 3 Schriftelijke toets.
Programmeren met kinderen NWT-conferentie basisonderwijs SPANNING & SENSATIE.
verhoudingen – breuken – procenten - kommagetallen
Agenda  Lesuur minuten  Wat kun je met programmeren?  Wat is code en hoe werkt het?  Code schrijven: de basis  Lesuur minuten  Zelf.
Welkom! maandag 16 November 2015 Les B-2.
Les 3 - Operators Workshop Php Basic. ICT Academy Php Basic Content Operators Wiskundig Toewijzing Vergelijking.
Na de praktijk, de theorie.. Zoals een gehaktmolen 1.Je stopt er iets in. 2.Je hoeft niet te weten wat er binnenin gebeurt. 3.Het resultaat verschijnt.
Berekening van de Orde Van een Algoritme
Kennismaking met programmeren
Wat is het grootste getal
-calculus versus Scheme
Informatieverwerkende systemen
Gameprogrammeren: Arrays
Voorkennis Wiskunde Les 11 Hoofdstuk 5: §5.3 en §5.4.
Transcript van de presentatie:

Functioneel Programmeren Daan Leijen

Wat gaan we doen? 3 fundamentele principes van computatie Equationeel redeneren IO-monad GUI's in Haskell (wxHaskell) Bouncing balls

De 3 principes van computatie Geformuleerd door de wiskundige Leibniz in 1666 in zijn "Dissertatio de arte combinatoria" Leibniz probeerde alle redenaties te reduceren tot een combinatie van basis waarden zoals getallen, letters, geluiden en kleuren. Abstractie Parametrisatie Reductie

0. Waarden 32 2*16 twee-en-dertig 4*4 + 4*4 thirty-two …

0. Vele soorten waarden 32(getal) 'a'(letter) "hoi"(string) ["hoi","hi"](lijst van strings) length(functies)  (plaatjes (bitmaps)) { } (set van kleuren)

0. Waarden Programmeren is niets anders dan een waarde opschrijven…

1. Abstractie 4*4 + 4*4 let x = 4*4 in x+x of ook: x + x where x = 4*4

2. Reductie We hebben een reductie regel nodig om te "rekenen" Formeel: let x = e 1 in e 2 == e 2 [x  e 1 ] Heet ook: β-reductie of Leibniz-rule

2. Reductie Reductie in de praktijk: let x = 4*4 in x+x == { reductie (abstractie) } 4*4 + 4*4 == { wiskunde } 32

3. Parametrisatie Definieer 1 functie voor vele waarden: fun :: Int -> Int fun a = let x = a*a in x+x

3. Parametrisatie Ook hier geldt reductie fun 4 =={ parametrisatie } let x = 4*4 in x+x =={ abstractie } 4*4 + 4*4 =={ wiskunde } 32

Helium Reductie is wel veel werk, dus dat laten we de computer doen…

Equationeel redeneren Som van een lijst: sum :: [Int]  Int sum [] = 0 sum (x:xs) = x + sum xs

Equationeel redeneren sum [1,2] =={ syntax } sum (1 : (2 : [])) =={ leibniz } 1 + sum (2:[]) =={ leibniz } 1 + (2 + sum []) == { leibniz } =={ wiskunde } 3

Functies Met de basis principes kun je alleen functies construeren: Voor gegeven parameters altijd hetzelfde resultaat.

Vergelijk let x = "hi" in (x ++ x) let x = getLine in (x ++ x) String x = System.In.GetLine(); System.Out.WriteLine(x); (getLine ++ getLine)

Side-effects Het gaat mis omdat "getLine" geen functie is. We krijgen steeds andere resultaten. Er bestaan vele van dit soort operaties: "putStr", "random", "showWindow", etc.

"do" notatie Met de "do" notatie kunnen we expliciet zijn hoe vaak iets geevalueerd word. do x <- getLine putStr (x ++ x) do x <- getLine y <- getLine putStr (x ++ y)

Typering We willen ons eerdere voorbeeld voorkomen. getLine :: IO String putStr :: String -> IO () getLine ++ getLine

"do" notatie De "do" notatie pakt IO waardes uit. do x <- getLine putStr (x ++ x) :: IO String :: String :: IO ()

Pure waarden Met "return" maken we van een gewone waarde een IO computatie: return :: a -> IO a do x <- getLine return x == getLine

Sequence Abstraheren over computaties: sequence :: [IO a] -> IO [a] sequence [] = return [] sequence (io:ios) = do x <- io xs <- sequence ios return (x:xs)

Voorbeeld Laat een lijst van strings zien of putStrs :: [String] -> IO [()] putStrs xs = sequence (map putStr xs) putStrs = sequence. map putStr

Sequence_ Vergeet het resultaat: sequence_ :: [IO a] -> IO () sequence_ ios = do xs <- sequence ios return ()

Ultimate IO: GUI's

The perfect GUI library Efficient Portable Native look-and-feel Lots of standard functionality Easy to use

wxWidgets Large C++ library for writing GUI's: Portable (Windows, GTK, MacOS X, Symbian, etc) Wrapper around native controls. Free and open source Active developer/user community Dynamic event model

AOL communicator

Audacity

wxHaskell A binding of Haskell and wxWidgets It is huge: 2800 methods 1400 constants 500 classes

Demo

The technology behind the winners..

It is portable

Minimal program main = start gui gui :: IO () gui = do frame [text := "hello!"] return () [Prop (Frame ())] -> IO (Frame ())

Buttons main = start gui gui :: IO () gui = do f <- frame [text := "Hello!"] q <- button f [text := "Quit"] set f [layout := widget q] Frame a ->[Prop (Button ())]->IO (Button ())

Event handlers gui :: IO () gui = do f <- frame [text := "Hello!"] b <- button f [text := "Quit",on command := close f] set f [layout := widget b]

Setters set w ps = sequence (map (set1 w) ps) set1 w p = …

Layout combinators layout := widget b margin 10 $ floatCenter (widget b) margin 10 $ column 5 [floatCenter(caption "Hello"),floatCenter(widget b)] Layout -> Layout

Complex layout

Bouncing Balls

Representation Iedere bal is gerepresenteerd als een lijst van al zijn toekomstige posities. t0 = [] … t10 = [[(4,8),(4,7),(4,6),…],[(9,1),(9,0),(9,1),(9,2),…]] … t11 = [[(4,7),(4,6),…],[(9,0),(9,1),(9,2),…]]

Questions?