Functioneel programmeren

25
Functioneel programmeren Een snelle herhaling…

description

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

Transcript of Functioneel programmeren

Page 1: Functioneel programmeren

Functioneel programmeren

Een snelle herhaling…

Page 2: Functioneel programmeren

Functie-definitie

static int kwad (int x){ return x*x ;}

kwad x = x * x Haskell

kwad :: Int Int

Page 3: Functioneel programmeren

Functie-definitie

static int fac (int n){ int tel, res; res = 1; for (tel=1; tel<=n; tel++) res *= tel; return res;}

fac n = product [1..n] Haskell

fac :: Int Int

Page 4: Functioneel programmeren

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]

Page 5: Functioneel programmeren

Herhalen

fac :: Int Int

fac n = 1=

| n==0| n>0

“recursie”

n * fac (n-1)

graag zonder product te gebruiken

Page 6: Functioneel programmeren

Partieel parametriseren

Stel:

En dan:

plus :: Int Int Intplus x y = x + y

drieMeer :: Int Int drieMeer = plus 3

> map drieMeer [1, 2, 3, 4, 5][4, 5, 6, 7, 8]

Page 7: Functioneel programmeren

Definitie van map

Geef een recursieve definitie:

map :: (ab) [a] [b]

map f [ ] =map f (x:xs)=

[ ]map f xs

f x

:

Page 8: Functioneel programmeren

Een ander soort lijst-functies

product :: [Int] Int product [ ] =product (x:xs)

=

1product xsx *

and :: [Bool] Bool and [ ] =and (x:xs)=

Trueand xsx

&&sum :: [Int] Int sum [ ] =sum (x:xs)

=

0sum xsx +

Page 9: Functioneel programmeren

Universele “lijst-totalisator”

foldr :: [a] a

foldr (#) e [ ] =foldr (#) e (x:xs)=

efoldr (#) e xsx #

(aaa) a

zo combineren neutrale waarde

Page 10: Functioneel programmeren

Universele “lijst-totalisator”

foldr :: [a] b

foldr (#) e [ ] =foldr (#) e (x:xs)=

efoldr (#) e xsx #

(abb) b

zo combineren neutrale waarde

Page 11: Functioneel programmeren

Had dat eerder gezegd...

Als foldr de generalisatie isvan sum, product, en and ....

.... dan zijn sum, product, en andspeciale gevallen van foldr

product = foldr (*) 1and = foldr (&&) Truesum = foldr (+) 0or = foldr (||) False

Page 12: Functioneel programmeren

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

Page 13: Functioneel programmeren

Anonieme functies

> map f [1 .. 4]where f x = x*x + 3*x + 2

[6, 12, 20, 30]

> map f [1 .. 4][6, 12, 20, 30]

( \ x x*x+3*x+2 )

Page 14: Functioneel programmeren

Lambda-expressies

x*x + 3*x + 2

expressie waarx vrij in voorkomt

\ x

de functie die dieexpressie uitrekent

Page 15: Functioneel programmeren

Functies op lijsten

> [4, 6, 1] ++ [2, 4][4, 6, 1, 2, 4]

(++) :: [a] [a] [a][ ] ++ ys = ys(x:xs) ++ ys = x : (xs++ys)

Page 16: Functioneel programmeren

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

Page 17: Functioneel programmeren

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 ”

Page 18: Functioneel programmeren

Lazy evaluation

Parameters worden pas uitgerekendals ze echt nodig zijn

Geldt ook voor (:)dus alleen deel van een lijstdat echt nodig iswordt uitgerekend

Page 19: Functioneel programmeren

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

Page 20: Functioneel programmeren

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’) ]

Page 21: Functioneel programmeren

Lijst-comprehensies

Speciale notatie

betekent hetzelfde alsmaar leest lekkerder dan

[ expressie | x lijst , predicaat ]

map (\xexpressie ) (filter (\xpredicaat) lijst )

Page 22: Functioneel programmeren

Zelf datastructuren ontwerpen

data Boom a = Blad | Tak a (Boom a) (Boom a)

constructorfuncties

het nieuwetype

types van de parameters van de constructorfuncties

Page 23: Functioneel programmeren

Opnieuw de lijst uitvinden

data Lijst a = Nil | Cons a (Lijst a)

constructorfuncties

het nieuwetype

types van de parameters van de constructorfuncties

Page 24: Functioneel programmeren

Een datastructuur opschrijven

Lijst

Boom

[ ]4 :3 :2 :1 :

BladTak 2 BladTak 4 Blad BladTak 7 ( )

( )Tak 5 (Tak 1 Blad Blad ) (Blad )

Tak 3 ( ) ( )

Page 25: Functioneel programmeren

Functies op datastructuren

omvang

diepte

omvang :: Boom a Intomvang Blad = 0omvang (Tak x li re)

= 1 + omvang li + omvang re

diepte :: Boom a Intdiepte Blad = 0diepte (Tak x li re) = 1 + max (diepte li) (diepte re)