Deel I: Functionele Programmeertalen Hoofdstuk 4: Functioneel Programmeren.

26
Deel I: Functionele Deel I: Functionele Programmeertalen Programmeertalen Hoofdstuk 4: Functioneel Programmeren

Transcript of Deel I: Functionele Programmeertalen Hoofdstuk 4: Functioneel Programmeren.

Page 1: Deel I: Functionele Programmeertalen Hoofdstuk 4: Functioneel Programmeren.

Deel I: FunctioneleDeel I: FunctioneleProgrammeertalenProgrammeertalen

Hoofdstuk 4:

Functioneel Programmeren

Page 2: Deel I: Functionele Programmeertalen Hoofdstuk 4: Functioneel Programmeren.

Functies

xxx kwadraat

De equivalente -uitdrukking:

xxx .kwadraat

Functienotatie:

Page 3: Deel I: Functionele Programmeertalen Hoofdstuk 4: Functioneel Programmeren.

Voorwaardelijke functies

0,0

0,/

y

yyxyxquotient

De equivalente -uitdrukking

y

vxyxv

yyxyxy

,

) 0 )0()(/)(0(.

if

failififquotient

Page 4: Deel I: Functionele Programmeertalen Hoofdstuk 4: Functioneel Programmeren.

Patroonherkenning

yxyx

x

/

00

quotient

quotient

De equivalente -uitdrukking

)/( 0 )0(. yxyxy ifquotient

Page 5: Deel I: Functionele Programmeertalen Hoofdstuk 4: Functioneel Programmeren.

Lijsten

Miranda-notatie: [ ] [1,2,3] e : l hd l tl l

Page 6: Deel I: Functionele Programmeertalen Hoofdstuk 4: Functioneel Programmeren.

Lijsten

lla lengtelengte

lengte

1:

0] [

De equivalente -uitdrukking

))(1( 0 ]) [(. xxx tllengteiflengte

Page 7: Deel I: Functionele Programmeertalen Hoofdstuk 4: Functioneel Programmeren.

Lijsten

lla

alla

evensevens

modevensevens

evens

:

02 ,1:

0] [

De equivalente -uitdrukking

)))(())(1(

)02 (( 0 ]) [(.

xx

xxx

tlevenstlevens

modhdififevens

Page 8: Deel I: Functionele Programmeertalen Hoofdstuk 4: Functioneel Programmeren.

Functies op lijstena ++ b concatenatiehd a eerste element van de lijst atl a staart van de lijst a (lijst

zonder kop)length a lengte van de lijst atake n a lijst met eerste n elementen

van lijst adrop n a lijst zonder de eerste n

elementen van lijst aprefix n a lijst met eerste n elementen

van lijst a

Page 9: Deel I: Functionele Programmeertalen Hoofdstuk 4: Functioneel Programmeren.

Functies op lijstensuffix n a lijst met laatste n elementen

van lijst atakewhile c a maximaal prefix van lijst a

waarvoor c geldtdropwhile c a lijst na het droppen van kop-

elementen waarvoor c geldtreverse a lijst van elementen van lijst a

in omgekeerde volgordezip a b lijst met koppels uit a en b, in

dezelfde volgorde

Page 10: Deel I: Functionele Programmeertalen Hoofdstuk 4: Functioneel Programmeren.

Functies op lijstenproduct a b scalair product van de lijsten

a en bposition a x positie van x in lijst amap f a lijst met f toegepast op de

elementen van afilter f a lijst met de elementen van a

waarvoor f a waar is

Page 11: Deel I: Functionele Programmeertalen Hoofdstuk 4: Functioneel Programmeren.

Generische lijstfuncties

)))(((],,,[

)))(((],,,[

2121

n2121

afxfxfxxxxaf

xfxfxfaxxxaf

nn

n

foldr

foldl

[ ]

foldrconcatlist

foldrproduct

foldlsom

1

0

Page 12: Deel I: Functionele Programmeertalen Hoofdstuk 4: Functioneel Programmeren.

Functie let-in

0],,[

0)],2/([

0],[

wortels in

4let

2sqrt

2sqrt d

dab

d

cba

cabbd

adb

adb

De equivalente -uitdrukking voorlet x = M in N: (x.N)M met applicatieve evaluatievolgorde

Page 13: Deel I: Functionele Programmeertalen Hoofdstuk 4: Functioneel Programmeren.

Functie where

cabbd

d

dab

d

cba

adb

adb

4where

0],,[

0)],2/([

0],[

wortels

*2sqrt

*2sqrt

De equivalente -uitdrukking voorN where x = M: (x.N)M

Page 14: Deel I: Functionele Programmeertalen Hoofdstuk 4: Functioneel Programmeren.

Functie where

cabbd

daz

dzlet

dab

d

cba

zzb

zzb

4where

0],,[in *2

sqrt

0)],2/([

0],[

wortels

2

1

2

1

2

1

De equivalente -uitdrukking voorN where x = M: (x.N)M

Page 15: Deel I: Functionele Programmeertalen Hoofdstuk 4: Functioneel Programmeren.

Lijstcomprehensies

]02 ];100..0[|[ modnnn

Quicksort kan neergeschreven worden als

]);|[:(

];|[:

] [] [

ablbba

ablbbla

sort

sortsort

sort

Page 16: Deel I: Functionele Programmeertalen Hoofdstuk 4: Functioneel Programmeren.

Recursie

))1(( 1 )0( nnnn faciffac

De reductie van fac 5 geeft aanleiding tot

1)2)3)45(((

)))12(3(4(5

Page 17: Deel I: Functionele Programmeertalen Hoofdstuk 4: Functioneel Programmeren.

Accumulatoren))( )1( ( )0( annanan faciffac

De reductie van fac 2 geeft aanleiding tot

221

121

))1210( )10( (121 )00(

)121( )11(

))121( )11(( 1)(2 )01(

)12( )12(

))12( )12( ( (1) )02( 1 2

facif

fac

facif

fac

faciffac

)(

Page 18: Deel I: Functionele Programmeertalen Hoofdstuk 4: Functioneel Programmeren.

(Naive) reverse

][):(

] [] [

kssk

reversereverse

reverse

inverse [a, b, c] geeft:[ ] + + [c] + + [b] + + [a]

= c:b:a:[ ]

Page 19: Deel I: Functionele Programmeertalen Hoofdstuk 4: Functioneel Programmeren.

Reverse

):( ):(

] [

aksask

aa

reversereverse

reverse

reverse [a,b,c] [ ]

reverse [b,c] a:[ ]

reverse [c] b:a:[ ]

reverse [ ] c:b:a:[ ]

c:b:a:[ ]

Page 20: Deel I: Functionele Programmeertalen Hoofdstuk 4: Functioneel Programmeren.

Continuaties)))(.( )1( )(1 ( )0( znczncncn faciffac

))1))(2)(..(.()(11(

)))1))(2)(..(.()(11( (

)1))2)(..((( )01(

))2)(..()(12(

)))2)(..()(12( (

)1).(( )02(

. 2

bazzab

bazzab

azza

azza

azza

zz

zz

fac

fac

if

fac

fac

if

fac

Page 21: Deel I: Functionele Programmeertalen Hoofdstuk 4: Functioneel Programmeren.

Continuaties)))(.( )1( )(1 ( )0( znczncncn faciffac

212112

)112)(.(

)11))(2)(..((

1))1))(2)(..(.((

)))0))(1))(2)(..(.(.()(10( (

)1))1))(2)(..(.((( )00(

. 2

zz

azza

bazzab

cbazzabc

bazzab

zz

fac

if

fac

Page 22: Deel I: Functionele Programmeertalen Hoofdstuk 4: Functioneel Programmeren.

Applicatieve continuatie

2121121)12.(

)1)12.(( )00(

))12.)(11(

))1)(2..()(11(

)))1)(2..()(11( (

)1)2.(( )01(

)2.)(12(

))2)(..()(12(

)))2)(..()(12( ( )1).(( )02(

. 2

bb

bb

bb

baab

baab

aa

aa

azza

azzazz

zz

if

fac

fac

fac

if

fac

fac

facif

fac

Page 23: Deel I: Functionele Programmeertalen Hoofdstuk 4: Functioneel Programmeren.

Transformatie tussen een imperatief en een

functioneel programmafunction fac(n: integer): integer;varf: integer;

beginf := 1;while n > 1 dobeginf := f * n;n := n - 1

end;fac := f

end;

Page 24: Deel I: Functionele Programmeertalen Hoofdstuk 4: Functioneel Programmeren.

Stroomdiagramma),1,(),,( 21 facnffacfnf

),,(),,(),1(),,( 532 facfnffacfnfniffacfnf

),*,(),,( 43 facnfnffacfnf

),,1(),,( 24 facfnffacfnf

),,(),,( 65 ffnffacfnf

facfacfnf ),,(6

fac:=f

f:=1

n>1

f:=f*n

n:=n-1 stop

Page 25: Deel I: Functionele Programmeertalen Hoofdstuk 4: Functioneel Programmeren.

Verzameling van functies

facfacfnf

ffnffacfnf

facfnffacfnf

facnfnffacfnf

facfnf

facfnfniffacfnf

facnffacfnf

),,(

),,(),,(

),,1(),,(

),,(),,(

)),,((

)),,()(1(),,(

),1,(),,(

6

65

24

43

5

32

21

Resultaat: f1(n, f, fac)

Page 26: Deel I: Functionele Programmeertalen Hoofdstuk 4: Functioneel Programmeren.

Vereenvoudigingen

-conversies

ffacnfnfniffacfnf

facnffacfnf

)),,1()(1(),,(

),1,(),,(

22

21

-conversies

fnfnfacniffnfac

nfacnfac

)),1(2)(1(),(2

)1,(2)(