250 likes | 367 Views
Functioneel programmeren. Een snelle herhaling…. kwad x = x * x. Haskell. Functie-definitie. static int kwad (int x) { return x*x ; }. kwad :: Int Int. static int fac (int n) { int tel, res; res = 1; for (tel=1; tel<=n; tel++) res *= tel; return res; }.
E N D
Functioneel programmeren Een snelle herhaling…
kwad x = x * x Haskell Functie-definitie static int kwad (int x) { return x*x ;} kwad :: Int Int
static int fac (int n) { int tel, res; res = 1; for (tel=1; tel<=n; tel++) res *= tel; return res; } Haskell Functie-definitie fac n = product [1..n] fac :: Int Int
Functies als parameter • Pas functie toe op alleelementen van een lijst map > map fac [1, 2, 3, 4, 5] [1, 2, 6, 24, 120] > map sqrt [1.0, 2.0, 3.0, 4.0] [1.0, 1.41421, 1.73205, 2.0] > map even [1 .. 6] [False, True, False, True, False, True]
Herhalen fac :: Int Int fac n | n==0 | n>0 = 1 = fac (n-1) n * graag zonder product te gebruiken “recursie”
Partieel parametriseren plus :: Int Int Int plus x y = x + y • Stel: • En dan: drieMeer :: Int Int drieMeer = plus 3 > map drieMeer [1, 2, 3, 4, 5] [4, 5, 6, 7, 8]
Definitie van map • Geef een recursieve definitie: map :: (ab) [a] [b] [ ] map f [ ] =map f (x:xs) = f x : map f xs
Een ander soort lijst-functies product :: [Int] Int 1 product [ ] =product (x:xs) = product xs x * and :: [Bool] Bool True and [ ] =and (x:xs) = and xs x && sum :: [Int] Int 0 sum [ ] =sum (x:xs) = sum xs x +
Universele “lijst-totalisator” foldr :: [a] a (aaa) a zo combineren neutrale waarde foldr (#) e [ ] =foldr (#) e (x:xs)= e foldr (#) e xs x #
Universele “lijst-totalisator” foldr :: [a] b (abb) b zo combineren neutrale waarde foldr (#) e [ ] =foldr (#) e (x:xs)= e foldr (#) e xs x #
Had dat eerder gezegd... • Als foldr de generalisatie isvan sum, product, en and .... • .... dan zijn sum, product, en andspeciale gevallen van foldr product = foldr (*) 1 and = foldr (&&) True sum = foldr (+) 0 or = foldr (||) False
Hoger-ordefuncties op lijsten • Doorloop een lijst en ... map :: (ab) [a] [b] filter :: (aBool) [a] [a] foldr :: (abb) b [a] b [a] [a] [a] doe dit pak deze combineer zo
Anonieme functies > map f [1 .. 4]where f x = x*x + 3*x + 2 [6, 12, 20, 30] ( \ x x*x+3*x+2 ) > map f [1 .. 4] [6, 12, 20, 30]
Lambda-expressies expressie waarx vrij in voorkomt x*x + 3*x + 2 \ x de functie die dieexpressie uitrekent
Functies op lijsten > [4, 6, 1] ++ [2, 4] [4, 6, 1, 2, 4] (++) :: [a] [a] [a] [ ] ++ ys = ys (x:xs) ++ ys = x : (xs++ys)
Functies op lijsten > concat [ [3, 4, 5], [ ], [1, 2], [6] ] [3, 4, 5, 1, 2, 6] concat :: [[a]] [a] concat [ ] = [ ] concat (xs:xss) = xs ++ concat xss concat xss = foldr (++) [ ] xss
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 ”info ” ) ”info info info info info ”
Lazy evaluation • Parameters worden pas uitgerekendals ze echt nodig zijn • Geldt ook voor (:)dus alleen deel van een lijstdat echt nodig iswordt uitgerekend
Oneindige lijsten iterate :: (aa) 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
Lijst-comprehensies • Notatie uit de verzamelingenleer { x*x | x N, x<10 } > [ x*x | x [1..10], even x ] [4, 16, 36, 64, 100] > [ (x,y) | x [1,4,8], y ”ab” ] [ (1,’a’), (1,’b’), (4,’a’), (4,’b’), (8,’a’), (8,’b’) ]
Lijst-comprehensies • Speciale notatie • betekent hetzelfde alsmaar leest lekkerder dan [ expressie | x lijst , predicaat ] map (\xexpressie ) (filter (\xpredicaat) lijst )
Zelf datastructuren ontwerpen het nieuwetype dataBoom a = Blad | Tak a (Boom a) (Boom a) constructorfuncties types van de parameters van de constructorfuncties
Opnieuw de lijst uitvinden het nieuwetype dataLijst a = Nil | Cons a (Lijst a) constructorfuncties types van de parameters van de constructorfuncties
Een datastructuur opschrijven • Lijst • Boom [ ] 1 : 2 : 3 : 4 : Tak 3 ( ) ( ) Tak 7 ( ) ( ) Tak 4 Blad Blad Tak 2 Blad Blad Tak 5 (Tak 1 Blad Blad ) (Blad )
Functies op datastructuren omvang :: Boom a Int omvang Blad = 0 omvang (Tak x li re) = 1 + omvang li + omvang re • omvang • diepte diepte :: Boom a Int diepte Blad = 0 diepte (Tak x li re) = 1 + max (diepte li) (diepte re)