Hogere-orde functies: herhaald patroon? Parametrizeer! product :: [Int]  Int product [ ]= product (x:xs)= 1 product xs x * and :: [Bool]  Bool and [

Slides:



Advertisements
Verwante presentaties

Advertisements

Inleiding programmeren in C++ Life Science & Technology 1 maart Universiteit Leiden.
Arduino project.
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.
Uitwerking tentamen Functioneel Programmeren 29 januari 2009.
Hogere-ordefuncties nEen lijst langs lopen en met elk element iets doen nEen lijst langs lopen en sommige elementen selecteren map filter.
Reductiemachine Functionele talen en dus de -calculus, worden vaak geïmplementeerd door een reductiemachine. De elementaire stap is een reductie, en de.
GESPRG Les 14 Gestructureerd programmeren in C. 174 Details! The devil is in the details.
Het type int Tekenen met Java operatoren
 - congruentie -regel:
1 SOCS Hoofdstuk 1 Programmeertaal C. 2 Kenmerken van C Hogere programmeertaal  Grote verzameling types, strenge type controle  Zelf nieuwe types definiëren.
VHDL Peter Slaets KHLim Functies en procedures Functies –type conversie functies »bit vector to integer en omgekeerd –verkorte componenten met maar 1 output.
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.
Functies op Proposities evalueer:: Bedeling  Prop  Bool tautologie:: Prop  Bool contradictie:: Prop  Bool equivalentie:: Prop  Prop  Bool vervulbaar::
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.
Combineren van zoektermen met Booleaanse operatoren
Business Source Premier (BSP) Combineren van zoektermen met Booleaanse operatoren Universiteitsbibliotheek verder = klikken.
ERIC Combineren van zoektermen met Booleaanse operatoren
Functies als Getallen Jan Martin Jansen.
-calculus.
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.
Ontleden nNon-deterministisch m.b.v. Parser-combinators nDeterministisch m.b.v. Stack-machine type Parser a b = [a]  [ (b, [a]) ] type Parser a b = [a]
Functioneel Programmeren Daan Leijen. Wat gaan we doen? 3 fundamentele principes van computatie Equationeel redeneren IO-monad GUI's in Haskell (wxHaskell)
Static Keyword static voor functieleden functie niet voor een object aangeroepen class K {... static int minimum( int i, int j); } aanroep: K::minimum(
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.
Datastructuren Sorteren, zoeken en tijdsanalyse
Hoofdstuk 5 – Verzameling en functie
Taal nEen Alfabet is… een eindige verzameling symbolen nEen Taal is… een deelverzameling van T* bij een bepaald alfabet T nEen Zin is… een element van.
uit: Wiskunde in beweging – Theo de Haan
Samenvatting hst. 3 sec. 1-3 ( ) :: Parser a b  Parser a b  Parser a b ( ) :: Parser a (b  c)  Parser a b  Parser a c ( ) :: (b  c)  Parser a b.
Het gebruik van FP op een meeloopdag voor middelbare scholieren Paul de Mast.
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;
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.
Definitie LL(1) Een grammatica is LL(1) nAls je op grond van het eerstvolgende input-symbool kunt kiezen uit alternatieven Formeel: nAls de lookahead-sets.
(S)DT Haskell Functioneel programmeren.
(S)DT Haskell Deel 2 list comprehensions, types en type klassen, programma transformatie, I/O.
Sociological Abstracts Combineren van zoektermen met Booleaanse operatoren Universiteitsbibliotheek verder = klikken.
Definitie Taal van een grammatica nZij grammatica G = ( T, N, R, S ) nde taal van G is { z  T* | S  * z } L(G)
1 PI1 week 9 Complexiteit Sorteren Zoeken. 2 Complexiteit van algoritmen Hoeveel werk kost het uitvoeren van een algoritme (efficiëntie)? –tel het aantal.
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1  de track structuur van een MIDI file interpreteren.
Les 3 - Operators Workshop Php Basic. ICT Academy Php Basic Content Operators Wiskundig Toewijzing Vergelijking.
Loops en errors Array's Random try catch for loop while loop do while loop.
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.
GUI & classes Een Gui in een class steken en het object gebruiken.
IF() ELSE() LES 4: VOORWAARDEN. BOOL Een variabele die slechts 2 mogelijke waarden kan hebben: true(waar) of false(niet waar) duid je aan met bool bool.
Informatie beoordelen If else Switch En Wiskunde.
(de eenvoudige versie).   Teken een rechthoek voor het speelveld.  Maak 2 cirkels die je via de toetsen ASWD (voor speler 1) of de pijltjestoetsen.
LPI 1.05 Marcel Nijenhof. Agenda ● Customize and use the shell environment ● Customize or write simple scripts ● SQL data management.
Vraag 1: Functies Bestudeer dit stukje code: >> print (4.0/3.0)* *1**3 >> print (4.0/3.0)* *2**3 >> print (4.0/3.0)* *3**3 >> print.
Javascript. Voortgang op: Account gegevens Invullen op: Bevestiging ontvangen ( ) via website?
Robby de Robot. Javascript Tot nu toe gebruikt: – document.write(" Hello World "); – alert("tekst") – Toon een waarschuwingsvenster – prompt("tekst",
Berekening van de Orde Van een Algoritme
PHP arrays.
Gameprogrammeren: Keuzeopdrachten
Hoofdstuk 9.2 Strings.
Gameprogrammeren: Expressies
Gameprogrammeren: Herhalingen
Opdrachten herhalen public void tekenScherm (object o, PEA pea)
ASP.NET MVC Web Development
Implementatie Zoekboom
Software Development fundamentals
TOP met iTasks 2.
Python – For loop + strings
Transcript van de presentatie:

Hogere-orde functies: herhaald patroon? Parametrizeer! product :: [Int]  Int product [ ]= product (x:xs)= 1 product xs x * and :: [Bool]  Bool and [ ]= and (x:xs)= True and xs x && sum :: [Int]  Int sum [ ]= sum (x:xs)= 0 sum xs x +

Universele lijst-loper: foldr foldr :: [a]  a foldr (#) e [ ] = foldr (#) e (x:xs)= e foldr (#) e xs x # (a  a  a)  a  combineer-functie foldr :: (a  b  b)  b  [a]  b start-waarde

Partiële parametrizatie nfoldr is een generalisatie van sum, product, en and.... n…dus sum, product, en and kun je schrijven met foldr product= foldr (*) 1 and= foldr (&&) True sum= foldr (+) 0 or= foldr (||) False

Voorbeeld: sorteren (1/2) insert :: a  [a]  [a] insert e [ ] = [ e ] insert e (x:xs) | e  x= e : x : xs | e  x= x : insert e xs Ord a  isort :: [a]  [a] isort [ ]= [ ] isort (x:xs)= insert x (isort xs) Ord a  isort = foldr insert [ ]

Voorbeeld: sorteren (2/2) qsort :: [a]  [a] qsort [ ] = [ ] qsort (x:xs)= qsort (filter (<x) xs) ++ [x] ++ qsort (filter (  x) xs) Ord a  (Waarom hebben ze me nooit eerder verteld dat ‘t zo makkelijk is?)

Handige notaties (geleend uit de wiskunde) nLambda abstractie nLijst comprehensie \x  x*x [ x*y | x  [1..10], even x, y  [1..x] ] Om naamloze functies te maken intuitiever dan combinatie van map, filter & concat

Deel II Boomstructuren in Haskell

Binaire bomen met interne waarden Hoe codeer je dat in Java/C++/C# enz?

OO-aanpak van bomen class Tree {private Tree left, right; private int value; // constructor public Tree(Tree al, Tree ar, int av) {left = al; right=ar; value=av; } // bladeren gecodeerd met null }

OO-aanpak van bomen: binaire bomen met externe data class Tree { // lege superclass } class Leaf extends Tree { int value } class Node extends Tree { Tree left,right }

Functionele aanpak van bomen nIk wil een polymorf type nEn constructorfuncties Leaf :: a  Tree a Node :: Tree a  Tree a  Tree a Tree a data Tree a = Leaf a | Node (Tree a) (Tree a) nHaskell notatie:

definition = type Name type var typ = type Name data type var context constructor Name type | declaration constructor operator

Functies op bomen nNaar analogie van lijst-functies nschrijf je een functie op een boom: length :: [a]  Int length [ ]= 0 length (x:xs)= 1 + length xs size :: Tree a  Int size (Leaf v) = 1 size (Node lef rit) = size lef + size rit

Uitdaging: schrijf boom-functies nelem kijkt of een waarde in een boom zit nfront verzamelt alle waarden in een lijst elem :: a  Tree a  Bool elem x (Leaf y) = x==y elem x (Node lef rit)= elem x lef || elem x rit front :: Tree a  [a] front (Leaf y) = [ y ] front (Node lef rit)= front lef ++ front rit Eq a 

Toepassing: expressies type Expr= (3*a + 4*b) / c plus:: Expr  Expr  Expr maal:: Expr  Expr  Expr waarde :: [(String,Int)]  Expr  Int eenvoud :: Expr  Expr

Expressies: poging 1 type Expr= (3*a + 4*b) / c String plus:: Expr  Expr  Expr waarde :: [(String,Int)]  Expr  Int plus a b = a ++ “+” ++ b waarde tab s = foldr ??? ??? s 3+a4+b *

Expressies: poging 2 data Expr = | constructorfuncties waarmee je een Expr bouwt Con Var Plus Min Maal Deel Int String Expr types van de parameters die daarbij nodig zijn

Een datastructuur opschrijven nLijst nBoom [ ] 4 :3 :2 :1 : BladTak 2Blad Tak 4 Blad Blad Tak 7 ( ) ( ) Tak 5 (Tak 1 Blad Blad ) (Blad ) Tak 3 ( ) ( )

Een datastructuur opschrijven nExpr (Maal (Con 3) (Var “a”)) (Maal (Con 4) (Var “b”)) (3*a + 4*b) / c Plus Deel ( ) ( Var “c” )

Expressies: poging 3 data Expr = | constructorfuncties waarmee je een Expr bouwt Int String Expr Con Var :+: :-: :*: :/: Constructoren beginnen met hoofdletter of dubbelepunt constructorfuncties/operatoren waarmee je een Expr bouwt

Een datastructuur opschrijven nExpr Con 3 :*: Var “a” Con 4 :*: Var “b” (3*a + 4*b) / c :+: ( ) :/: ( Var “c” ) infixl 6 (:+:), (:-:) infixl 7 (:*:), (:/:)

Functies op Expressies plus:: Expr  Expr  Expr maal:: Expr  Expr  Expr waarde :: [(String,Int)]  Expr  Int eenvoud :: Expr  Expr plus = (:+:) maal = (:+:)

Functies op Expressies wrd :: [(String,Int)]  Expr  Int wrd t (Con n) wrd t (Var v) wrd t (a:+:b) wrd t (a:-:b) wrd t (a:*:b) wrd t (a:/:b) ============ n zoekop t v wrd t a + wrd t b wrd t a – wrd t b wrd t a * wrd t b wrd t a / wrd t b

Functies op Expressies afg :: Expr  String  Expr afg (Con c) dx afg (Var v) dx = Con 0 | eqString v dx = Con 1 | otherwise = Con 0 afg (a:+:b) dx afg (a :-:b) dx = afg a dx :+: afg b dx = afg a dx :-: afg b dx “de afgeleide naar een variabele”

Functies op Expressies afg :: Expr  String  Expr afg (a:*:b) dx afg (a :/:b) dx = a :*: afg b dx :+: b :*: afg a dx = ( b :*: afg a dx :-: a :*: afg b dx ) :/: (b :*: b)

Twee soorten berekening nNumeriek nSymbolisch diff :: (Float  Float)  (Float  Float) diff f x = (f (x+h) – f x) / h where h = afg :: Expr  String  Expr afg (Con c) dx = Con 0 afg (Var v) dx | eqString v dx = Con 1 |otherwise = Con 0 afg (a:+:b) dx = afg a dx :+: afg b dx afg (a:*:b) dx = a :*: afg b dx :+: b :*: afg a dx dat is nou AI!

Rekenen met Booleans (&&) :: Bool  Bool  Bool (||) :: Bool  Bool  Bool not :: Bool  Bool True && y= y False && y= False True || y= True False || y= y notTrue= False notFalse= True

Symbolisch Proposities bewerken data Prop = | constructorfuncties waarmee je een Expr bouwt Bool String Prop Con Var Not :/\ :\/ :-> constructorfuncties/operatoren waarmee je een Prop bouwt

Functies op Proposities type Bedeling = [(String,Bool)] evalueer :: Bedeling  Prop  Bool > evalueer [ (“p”,True), (“q”, False) ] (Var “p” :/\ Var “q”) False

Functies op Proposities tautologie :: Prop  Bool contradictie :: Prop  Bool > tautologie (Var “p” :\/ Not (Var “p”)) True > contradictie (Var “p” :-> Var “q” ) False

Functies op Proposities equivalentie :: Prop  Prop  Bool vervulbaar :: Prop  [Bedeling] > vervulbaar (Var “p” :-> Var “q” ) [ [ (“p”,True),(“q”,True) ], [ (“p”,False),(“q”, False) ], [ (“p”,False),(“q”, True) ] ]

Functies op Proposities eenvoudig :: Prop  Prop > eenvoudig Not(Not (Var “p” :/\ (Var “q” :\/ Not Var “q”)) Not (Not (Var “p” :/\ Con True)) Not (Not (Var “p”)) Var “p” tautologieën en contradicties vervangen door constanten operatoren met constante parameters wegwerken dubbele Not wegwerken

Functies op Proposities normaalvorm :: Prop  Prop > normaalvorm (Not (Not Var “p” :\/ Var “q” ) Var “p” :/\ Not Var “q” Not alleen voor variabelen

Functies op Proposities toon :: Prop  String ontleed:: String  Prop > putStr (toon (Var “p” :-> Var “q”)) p -> q > ontleed “p && !p” Var “p” :/\ Not Var “p”

Functies op Proposities evalueer:: Bedeling  Prop  Bool tautologie:: Prop  Bool contradictie:: Prop  Bool equivalentie:: Prop  Prop  Bool vervulbaar:: Prop  [Bedeling] eenvoudig:: Prop  Prop normaalvorm:: Prop  Prop toon:: Prop  String ontleed:: String  Prop