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