ProInformatik: Funktionale Programmierung Woche 2

Werbung
Informatik Institut, Fachbereich Mathematik und Informatik
ProInformatik: Funktionale Programmierung
Woche 2: 4.-8.8.2008
Dozentin: Maria Knobelsdorf
Tutorin, Tutor: Peggy Sabri, Dirk Wiesenthal
28.7 – 22.8.2008
Raum 005, Takustr. 9
14195 Berlin
Tag 6, ILOs
• Wissen:
• Wiederholung
• Anwenden:
• Wiederholtes umsetzen
ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf
2
Wiederholung der 1. Woche
ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf
3
6. Wiederholung
•
•
•
•
•
•
•
•
Funktionsdefintion
Funktionsauswertung
Primitive Datentypen (Int, Float, Char, Bool)
Primitive Rekursion
Pattern Matching
Listen, Tupel
Polymorphe Funktionen
Funktionen höherer Ordnung
ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf
4
1. Funktionsdefinition
Signatur:
<Funktionsname>::<Paramtyp t1>->…-><Paramtyp tn> ->
<Ergebnistyp>
<Funktionsname> <ParamName1>…<ParamNameN> =
<Auswertungsvorschrift>
Beispiel:
add::Int->Int->Int
add x y = x+y
high::Int ->Int
high x = x+1
ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf
5
Funktionsaufruf
• Funktionen werden in Hugs mit ihrem Namen
aufgerufen und dabei werden konkrete Werte
übergeben.
Beispiel:
>add 1 2
3
>high 1
2
ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf
6
Der Punkt-Operator
• Es können mehrere Funktionen aufgerufen werden:
> high(high 1)
3
Dafür gibt es eine einfachere Schreibweise, den
Punkt-Operator:
> (high.high) 1
3
Mehr zur Signatur, gleich.
ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf
7
Funktionen mit Auswahl: Guards
<Funktionsname> <ParamName1>…<ParamNameN>
|<Boolscher Ausdruck> = <Auswertungsvorschrift>
|<Boolscher Ausdruck> = <Auswertungsvorschrift>
|<Boolscher Ausdruck> = <Auswertungsvorschrift>
...
|otherwise
= <Auswertungsvorschrift>
Beispiel:
maxi::Int->Int->Int
maxi x y
| x>= y = x
|otherwise = y
ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf
8
Guards, if, then else
• Guards können auch mit Hilfe der Wörter if, then,
else programmiert werden:
maxi x y
| x<= y = x
|otherwise = y
maxi x y = if (x<= y) then x else y
ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf
9
2. Funktionsauswertung
Funktionen werden durch das Einsetzungs(Reduktions-)verfahren ausgewertet:
• Ersetze in einem Ausdruck f solange Teilausdrücke
durch ihre Definitionen oder berechne den Wert
von Teilausdrücken, bis keine Reduktion mehr
möglich ist.
• Auswertung erfolgt von außen nach innen und
• Von links nach rechts gemäß Operatorpräferenz
• Lazy Evaluation: nur auswerten, wenn es nötig ist
ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf
10
Beispiele
(1)
func 0 y = 0
(2)
(3)
(4)
func x y
| (x<4)||(y>=6) = x+ func (x-1) y
| otherwise = func x (y-1)
Auswertung:
>func 3 1
(3<4)||(y>=6) = x+func(x-1)yTrue
3+func(3-1) 1
(Zeile 2)
(Zeile 3)
(Zeile 2,3)
3+( (2<4)||(y>=6) = x+func(x-1)y) 3+(True)
(Zeile 3)
3+(2+func(2-1) 1)
(Zeile 2,3)
3+(2+((1<4)||(y>=6) = x+func(x-1)y)) 3+(2+(True)) (Zeile 3)
3+(2+(1+(func (1-1) 1))
(Zeile 3)
3+(2+(1+(func 0 1)) 3+(2+(1+0)
3+(2+1)3+36
ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf
(Zeile 2)
(+)
11
3. primitive Datentypen
• Int: ganze Zahlen im Bereich -2^31 bis 2^31-1
• Float: Rationale Zahlen
• Char: Zeichen(‘$‘, ‘0‘,‘*‘,…), Buchstaben (‘a‘, ‘b‘,
‘c‘,…)
• Bool: Wahrheitswerte True und False
• Numerische und logische Operatoren:
• + - * /, < > <= >= == /=
ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf
12
4. Rekursion
• Rekursion als Umsetzung von Divide and Conquer
• Löse ein n-großes Problem indem es aufgeteilt wird
in ein einfaches und ein (n-1)-großes Problem
Berechne die Fakultät von n, wobei n>=0:1*2*…*n
fak::Int->Int
fak n
| n==0 = 1
| n==1 = 1
| otherwise = n*fak(n-1)
ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf
13
5. Pattern Matching
fak
|
|
|
n
n ==0 = 1
n ==1 = 1
otherwise = n*fak (n-1)
Pattern Matching:
fak 0 = 1
fak 1 = 1
fak n = n*fak (n-1)
ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf
14
6. Listen
• Elemente gleichen Typs kann man
zusammenfassen zu Listen:
[t] ist eine Liste mit Elementtyp t
• Alle Elemente haben eine feste Position in der Liste
Beispiele:
[1,2,3,89,23,0]::[Int]
[True, True,False]::[Bool]
[[1],[1,89,4],[0,0,0]]::[[Int]]
ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf
15
Strings
• Eine Liste von Char-Elementen wird String
genannt:
“hallo“::[Char]
ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf
16
Rekursion über Listen
sumList::[Int]->Int
Rekursionsanker
sumList [] = 0
sumList (x:xs)= x+sumList xs
Pattern
Matching
Rekursiver
Aufruf
(x:xs) ist ein „Pattern“, das eine Liste xs
und ihr erstes Element x „matcht“.
ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf
17
Pattern matching auf Listen
Beispiele:
sumList [1,2,3]
sumList (1:[2,3])
1+sumList (2:[3])
1+(2+sumList (3:[]))
1+(2+(3+(sumList [])))
1+(2+3)
1+5
6
ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf
18
ZF-Notation zur Listengenerierung
• Listen können aus anderen Listen generiert werden
mit Hilfe der ZF-Notation
• Sei xs die Basisliste und x Element der neuen Liste
l, dann kann l definiert werden als:
l == [x|x<-xs, x erfüllt Eigenschaft E]
Beispiel:
l1 == [x|x<-[1,2..],(mod x 2==0)&&x<21] – l1 ist
die Liste aller geraden Zahlen zwischen 1 und 20
ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf
19
Tupel
• Elemente verschiedener Typen kann man
zusammenfassen zu Tupeln:
(t1,…,tn) ist ein n-Tupel mit Elementtypen t1,…,tn
Beispiel:
(12,“blup“,True)::(Int,String,Bool)
ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf
20
7. polymorphe Funktion
• Polymorph bedeutet vielgestaltig und meint hier
eine Funktion deren Signatur aus DatentypVariablen besteht und somit für verschiedene
Datentypen nutzbar ist.
Beispiel:
laenge::[t]->Int
• t ist eine Datentyp-Variable
• laenge ist eine polymorphe Funktion
ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf
21
8. Funktionen höherer Ordnung
• Funktionen können als Parameter auch Funktionen
haben:
map:(a->b)->[a]->[b]
map f [] = []
map f (x:xs) = (f x):map f xs
double::Int->Int
double x = 2*x
>map (double) [1,2,3]
[2,4,6]
ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf
22
• Der Punktoperator ist auch eine Funktion höherer
Ordnung, außerdem polymorph:
(.)::(b->c)->(a->b)->a->c
Beispiel:
>(chr.high.ord) ‘a‘
‘b‘
ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf
23
6. Wiederholung
•
•
•
•
•
•
•
•
Funktionsdefintion
Funktionsauswertung
Primitive Datentypen (Int, Float, Char, Bool)
Primitive Rekursion
Pattern Matching
Listen, Tupel
Polymorphe Funktionen
Funktionen höherer Ordnung
ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf
24
Alles am Beispiel von Modul Picture: Unklarheiten
• Funktionen ohne Variablen? Lazy Programing?
above
above
above
above
:: Picture -> Picture -> Picture
= (++)
--Ist äquivalent zu:
p1 p2 = (++) p1 p2 --Ist äquivalent zu:
p1 p2 = p1 ++ p2
rotate :: Picture -> Picture
rotate = flipH . flipV
rotate p = (flipH . flipV) p
ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf
--Ist äquivalent zu:
25
Module Picture
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (+) [1,2,3] [4,5,6]
[5,7,9]
• zipWith hat drei Eingabeparameter, eine Funktion,
zwei Listen, und verknüpft mit der Funktion jeweils
ein Element aus beiden Listen:
zipWith f [] ys = []
zipWith f xs [] = []
zipWith f (x:xs) (y:ys) = (f x y): zipWith xs ys
ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf
26
!!
(!!)::[a]->Int->a
• Hat als Eingabe eine Liste xs und einen Int-Wert
0<=n<length xs und gibt das Element an der Stelle
n aus xs wieder
>[1,2,3] !! 2
3
Beginnt bei 0 zu zählen!
ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf
27
• Aufgaben 2.1-2.5
• Aufgaben 6.1-6.17
• Haben Sie noch Fragen?
ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf
28
Herunterladen