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.

Slides:



Advertisements
Verwante presentaties
Optellen en aftrekken tot 20
Advertisements

Bij een herhaald experiment, met telkens dezelfde kans op succes gebruiken we de binomiale kansverdeling Een binomiale kansverdeling wordt gekenmerkt door.
Leer de namen van de noten 1
vergelijkingen oplossen
dia's bij lessenserie Pythagoras ± v Chr.
Hoofdstuk 8: Recursie.
Ronde (Sport & Spel) Quiz Night !
MERKWAARDIGE PRODUCTEN
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.
PROS2 Les 11 Programmeren en Software Engineering 2.
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.
Datastructuren Analyse van Algoritmen en O
Leer de namen van de noten 2
 - congruentie -regel:
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 [
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.
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”
Reguliere talen nReguliere grammatica: versimpelde Contextvrije grammatica nFinite-state Automaton: andere manier om een taal te beschrijven nReguliere.
Imperatief programmeren nProgramma bestaat uit nRunnen is opdrachten gegroepeerd in methoden één voor één uitvoeren te beginnen met main.
Hoofdstuk Strings en arrays. Primitieve types nint gehele getallen-17, -5, 0, 3, 178 ndouble reëele getallen3.141, 2.0, -1.5E8 nbool waarheidswaarden.
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)
Werken aan Intergenerationele Samenwerking en Expertise.
Breuken-Vereenvoudigen
LauwersCollege Buitenpost Java Applet programma dat op een website zichtbaar is Java Application programma dat zelfstandig werkt Javascript Scripttaal.
1 Datastructuren Een informele inleiding tot Skiplists Onderwerp 13.
, 17h30Recursie 1 Inleiding tot recursie Karel Popelier.
A H M F K EB C x 87 Afwenden bij A en C, openen en doorlaten (rechtshouden, 1e peloton, dames tussendoor).
A H M F K EB C x 91 Van hand veranderen voor de X splitsen en Rechangeren. Met de nieuwe partner op.
A H M F K EB C x 85 Korte zijde bij C 2 e secties volte 14 m en op afstand komen ( 0,5 rijbaan)
A H M F K EB C x 88. Korte zijde bij A en C changement met gebroken lijnen (opsluiten!) Daarna rijden.
ZijActief Koningslust 10 jaar Truusje Trap
ECHT ONGELOOFLIJK. Lees alle getallen. langzaam en rij voor rij
Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 3: Werken met numerieke gegevens.
ware bewering niet ware bewering open bewering
6,50 euro In dit vakje zie je hoeveel je moet betalen.
De financiële functie: Integrale bedrijfsanalyse©
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.
Wiskunde kan helpen begrijpen hoe de wereld in elkaar zit.
ERIC Zoeken op onderwerp Universiteitsbibliotheek.
POL (MO)-methode  Dit is de kapstok waar je de rest van de zin aan op kunt hangen.  Vervolgens kijk je of er eventueel een meewerkend voorwerp in.
1 Zie ook identiteit.pdf willen denkenvoelen 5 Zie ook identiteit.pdf.
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.
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 1 Operating Systems practicum
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.
Vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 Onderwerpen voor vandaag top-down decompositie Opdrachten:
(S)DT Haskell Functioneel programmeren.
(S)DT Haskell Deel 2 list comprehensions, types en type klassen, programma transformatie, I/O.
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.
Gameprogrammeren: Objecten en geheugen
Hoofdstuk 9.2 Strings.
Gameprogrammeren: Expressies
Voorbeeld: Simulatie van bewegende deeltjes
Python – For loop + strings
Transcript van de presentatie:

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  c (a  c) combineer zo begin hiermee “na”

Lambda-expressies x*x + 3*x + 2 expressie waar x vrij in voorkomt \ x  de functie die die expressie uitrekent > map f [1.. 4] [6, 12, 20, 30] ( \ x  x*x+3*x+2 )

Zelftest nStel je schrijft een functie f die werkt op lijsten. Wat kun je routinematig alvast opschrijven? uals je recursie gebruikt, en gevalsonderscheid doet met patronen uals je recursie gebruikt, en gevalsonderscheid doet met guards uals je een hogere-ordefunctie (welke?) partieel parametriseert f

f ::....  [a] .... evt. extra parameters Functies op lijsten nBedenk eerst het type! resultaat nRecursie met patronen f [ ]=.... f (x:xs)=....x....f xs.... nRecursie met guards f xs| null xs =.... | True =....f (tail xs).. nZonder recursie f xs = foldr op e xs filter p map g

Functies op lijsten (++) :: [a]  [a]  [a] concat:: [[a]]  [a] head, last:: [a]  a tail, init:: [a]  [a] take, drop:: Int  [a]  [a] takeWhile:: (a  Bool)  [a]  [a] eqList:: (a  a  Bool)  [a]  [a]  Bool

Lijsten polymorf vergelijken nExtra functie meegeven eqList :: (a  a  Bool)  [a]  [a]  Bool eqList eq [ ][ ] = eqList eq [ ](y:ys) = eqList eq (x:xs)[ ] = eqList eq (x:xs)(y:ys) = True False eq x y && eqList eq xs ys

Lijsten vergelijken > eqList (==) [1,2,3] [1,2,3] True > eqList eqBool [True,False] [True] False > eqList (eqList (==)) [[1,2], [3,4]] [[1,2], [4,3]] False

Ordering nOrdering type met 3 elementen ordInt :: Int  Int  Ordering ordInt x y| x < y= LT | x==y= EQ | x > y= GT

Lexicografische ordening nLijsten kun je ordenen zoals woorden in een woordenboek ordList :: (a  a  Ord)  [a]  [a]  Ord > ordList ordInt [1, 2, 3] [1, 2, 4] LT > ordList ordInt [1, 3, 2] [1, 2, 4] GT

Lexicografische ordening ordList :: (a  a  Ord)  [a]  [a]  Ord ordList ord [ ][ ] = ordList ord [ ](y:ys) = ordList ord (x:xs)[ ] = ordList ord (x:xs)(y:ys) = EQ LT GT f (ord x y) wheref LT = f EQ = f GT = f (....) wheref.... LT ordList ord xs ys GT

Invoegen in een geordende lijst insert :: (a  a  Ord)  a  [a]  [a] insert ord e [ ]= [e] insert ord e (x:xs)= f (ord e x) wheref LT= e : x : xs f _= x : insert ord e xs isort :: (a  a  Ord)  [a]  [a] isort ord [ ]= [ ] isort ord (x:xs)= insert ord x (isort ord xs) isort ord = foldr (insert ord) [ ]

Geordende lijsten samenvoegen merge :: (a  a  Ord)  [a]  [a]  [a] merge ord [ ] ys= ys merge ord xs [ ]= xs merge ord (x:xs) (y:ys)= f (ord x y) wheref LT= x : merge ord xs (y:ys) f _= y : merge ord (x:xs) ys > merge ordInt [1, 3, 4] [2, 5, 6] [1, 2, 3, 4, 5, 6]

Primitieve types nIntgehele getallen nFloatgetallen met decimale punt nBoolTrue False nOrderingLT EQ GT nChar’a’ ’b’ ’A’ ’2’ ’#’

Char: lettertekens nConstanten nVergelijken nConversie ’a’ ’A’ ’1’ ’;’ eqChar :: Char  Char  Bool ordChar:: Char  Char  Ordering ord :: Char  Int chr:: Int  Char

String: lijst charcters nConstanten ”hoi” ”CKI” ”a12#” > map ord ”CKI” [67, 75, 73] eqString :: String  String  Bool eqString= eqList eqChar > eqString ”CKI” (map toUpper ”cki”) True

Functies op Strings words:: String  [String] unwords:: [String]  String > words ”dit is een zin” [ ”dit”, ”is”, ”een”, ”zin” ] > unwords [”dit”, ”zijn”, ”losse”, ”woorden”] ”dit zijn losse woorden”

unwords en words unwords[ ]= unwords[w]= unwords(w:ws)= words[ ]= wordscs= where eerste= rest= [ ] w w ++ ” ” ++ unwords ws [ ] eerste : words rest takeWh (not.isSp) cs dropWh (not.isSp) cs dropWh isSp ( )

Oneindige lijsten repeat :: a  [a] repeat x= x : repeat x > repeat 3 [3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3 replicate :: Int  a  [a] replicate n x= take n (repeat x) > concat (replicate 5 ”CKI ” ) ”CKI CKI CKI CKI CKI ”

Lazy evaluation nParameters worden pas uitgerekend als ze echt nodig zijn nGeldt ook voor (:) dus alleen deel van een lijst dat echt nodig is wordt uitgerekend

Oneindige lijsten iterate :: (a  a)  a  [a] iterate f x = x : iterate f (f x) > iterate ((+)1) 3 [3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20

5678 [5678, 567, 56, 5, 0, 0, [5678, 567, 56, 5] [8, 7, 6, 5] [5, 6, 7, 8] [’5’, ’6’, ’7’, ’8’] int2string = f5.f4.f3.f2.f1 where f1 = f2 = f3 = f4 = f5 = Functies combineren iterate (\x  x/10) takeWhile ((/=)0) map (\x  x-10*(x/10)) reverse map (\x  chr(x+48)) ”5678”

Datastructuren nLijst variabel aantal hetzelfde type nTupel vast aantal verschillend type rij :: [Int] rij = [1, 2, 3, 4, 5] paar:: (Int, String) paar = (3, ”hoi”)

Lijst van tupels telefoonboek :: [ (String, Int) ] telefoonboek = [ (”Jeroen”, 4118), (”Bastiaan”, 2585), (”Jur”, 3283), (”Arjan”, 1012) ] zoek :: [ (String, Int) ]  String  Int > zoek telefoonboek ”Bastiaan” 2585

Zoek in lijst van tupels zoek :: [ (String, Int) ]  String  Int zoek [ ] vraag = 0 zoek ( t : ts ) vraag > zoek telefoonboek ”Bastiaan” 2585 | eqString vraag naam = nr | otherwise = zoek ts vraag (naam,nr)

Char en String nCharéén letter uord ::Char  Int uchr ::Int  Char nString[Char] uwords :: String  [String] uunwords :: [String]  String ”hoi” ”CKI” ”a12#” ’a’ ’A’ ’1’ ’;’

Oneindige lijsten nOneindige lijst nLazy evaluation: oneindige lijst als tussenresultaat antwoord toch in eindige tijd repeat :: a  [a] repeat x= x : repeat x