12.07.2015 Aufrufe

Grundlagen der Programmierung in Haskell

Grundlagen der Programmierung in Haskell

Grundlagen der Programmierung in Haskell

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

Vorsemesterkurs Informatik<strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong>SoSe 2013Stand <strong>der</strong> Folien: April 5, 2013


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelÜbersicht1 Ausdrücke und Typen2 Funktionen3 Rekursion4 Listen5 Paare und TupelVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 2/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelProgrammieren <strong>in</strong> <strong>Haskell</strong> (2)In <strong>Haskell</strong> hat je<strong>der</strong> Ausdruck (und Unterausdruck) e<strong>in</strong>en TypTyp = Art des Ausdrucksz.B. Buchstabe, Zahl, Liste von Zahlen, Funktion, . . .Die Typen müssen zue<strong>in</strong>an<strong>der</strong> passen:Z.B. verboten1 + "Hallo"Die Typen passen nicht zusammen (Zahl und Zeichenkette)Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 4/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelTypenAn<strong>der</strong>e Sichtweise:Typ = Menge von Werten. . . -1421 1000IntegerVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 5/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelTypenAn<strong>der</strong>e Sichtweise:Typ = Menge von Werten Ausdrücken. . . -1421 1000f 10Integer-Werte100+20 . . .1*4*5*10IntegerVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 5/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelTypen (2)Im GHCi Typen anzeigen lassen:Prelude> :type ’C’ ←↪’C’ :: CharSprechweisen:”‘’C’ hat den Typ Char”’”‘’C’ ist vom Typ Char”’”‘’C’ gehört zum Typ Char”’Char ist <strong>der</strong> Typ <strong>in</strong> <strong>Haskell</strong> für Zeichen (engl. Character)Typnamen beg<strong>in</strong>nen immer mit e<strong>in</strong>em GroßbuchstabenVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 6/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelTypen (3)Im GHCi: :set +tführt dazu, dass mit jedem Ergebnis auch dessen Typgedruckt wird.*Ma<strong>in</strong>> :set +t ←↪*Ma<strong>in</strong>> zwei_mal_Zwei ←↪4it :: Integer*Ma<strong>in</strong>> oft_fuenf_addieren ←↪55it :: IntegerVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 7/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelTypen (4)Der Typ Integer stellt beliebig große ganze Zahlen darMan kann Typen auch selbst angeben:Schreibweise Ausdruck::Typ*Ma<strong>in</strong>> ’C’::Char ←↪’C’it :: Char*Ma<strong>in</strong>> ’C’::Integer ←↪:1:0:Couldn’t match expected type ‘Integer’aga<strong>in</strong>st <strong>in</strong>ferred type ‘Char’In the expression: ’C’ :: IntegerIn the def<strong>in</strong>ition of ‘it’: it = ’C’ :: IntegerVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 8/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelWahrheitswerte: Der Datentyp BoolWerte (Datenkonstruktoren) vom Typ Bool:True steht für ”‘wahr”’False steht für ”‘falsch”’Operationen (Funktionen):Logische Negation: not: liefert True für False und False für TrueLogisches Und: a && b: nur True, wenn a und b zu True auswertenLogisches O<strong>der</strong>: a || b: True, sobald a o<strong>der</strong> b zu True auswertet.*Ma<strong>in</strong>> not True ←↪Falseit :: Bool*Ma<strong>in</strong>> not False ←↪Trueit :: Bool*Ma<strong>in</strong>> True && True ←↪Trueit :: Bool*Ma<strong>in</strong>> False && True ←↪Falseit :: Bool*Ma<strong>in</strong>> False || False ←↪Falseit :: Bool*Ma<strong>in</strong>> True || False ←↪Trueit :: BoolVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 9/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelGanze Zahlen: Int und IntegerDer Typ Int umfasst ganze Zahlen beschränkter Größe(je nach Rechner, z.B. −2 31 bis 2 31 − 1)Der Typ Integer umfasst ganze Zahlen beliebiger GrößeVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 10/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelGanze Zahlen: Int und IntegerDer Typ Int umfasst ganze Zahlen beschränkter Größe(je nach Rechner, z.B. −2 31 bis 2 31 − 1)Der Typ Integer umfasst ganze Zahlen beliebiger GrößeDarstellung <strong>der</strong> Zahlen ist identisch z.B. 1000Default<strong>in</strong>g: Integer, wenn es nötig ist, sonst offenlassen:Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 10/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelGanze Zahlen: Int und IntegerDer Typ Int umfasst ganze Zahlen beschränkter Größe(je nach Rechner, z.B. −2 31 bis 2 31 − 1)Der Typ Integer umfasst ganze Zahlen beliebiger GrößeDarstellung <strong>der</strong> Zahlen ist identisch z.B. 1000Default<strong>in</strong>g: Integer, wenn es nötig ist, sonst offenlassen:Prelude> :type 10001000 :: (Num t) => tPrelude> :set +tPrelude> 10001000it :: IntegerIn etwa 1000 ist vom Typ t, wenn t e<strong>in</strong> numerischer Typ ist.Genauer: (Num t) => ist e<strong>in</strong>e sog. TypklassenbeschränkungInt und Integer s<strong>in</strong>d numerische Typen (haben Instanzen für Num)Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 10/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelGleitkommazahlenTypen Float und Double (mit doppelter Genauigkeit)Kommastelle wird mit . (Punkt) dargestelltTypklasse dazu: FractionalPrelude> :type 10.5 ←↪10.5 :: (Fractional t) => tPrelude> 10.5 ←↪10.5it :: DoubleBeachte: Das Rechnen mit solchen Kommazahlen istungenau!Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 11/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelZeichen und ZeichenkettenDer Typ Char repräsentiert ZeichenDarstellung: Zeichen <strong>in</strong> e<strong>in</strong>fache Anführungszeichen, z.B. ’A’Spezielle Zeichen (Auswahl):Darstellung <strong>in</strong> <strong>Haskell</strong> Zeichen, das sich dah<strong>in</strong>ter verbirgt’\\’ Backslash \’\’’ e<strong>in</strong>faches Anführungszeichen ’’\"’ doppeltes Anführungszeichen "’\n’ Zeilenumbruch’\t’ TabulatorZeichenketten: Typ Str<strong>in</strong>gDastellung <strong>in</strong> doppelten Anfühungszeichen, z.B. "Hallo".Genauer ist <strong>der</strong> Typ Str<strong>in</strong>g gleich zu [Char]d.h. e<strong>in</strong>e Liste von Zeichen (Listen behandeln wir später)Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 12/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelBeispiel Zeichenketten> :set +t> "E<strong>in</strong> \n\’mehrzeiliger\’\nText mit \"Anfuehrungszeichen\"""E<strong>in</strong> \n’mehrzeiliger’\nText mit \"Anfuehrungszeichen\""it :: [Char]> putStrLn "E<strong>in</strong> \n\’mehrzeiliger\’\nText mit \"Anfuehrungszeichen\""E<strong>in</strong>’mehrzeiliger’Text mit "Anfuehrungszeichen"it :: ()Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 13/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelOperatoren auf ZahlenOperatoren auf Zahlen <strong>in</strong> <strong>Haskell</strong>:Addition +, Substraktion -, Multiplikation * und Division /Beispiele: 3 * 6, 10.0 / 2.5, 4 + 5 * 4Beim - muss man aufpassen, da es auch für negative Zahlenbenutzt wirdPrelude> 2 * -2 ←↪:1:0:Precedence pars<strong>in</strong>g errorcannot mix ‘*’ [<strong>in</strong>fixl 7] and prefix ‘-’ [<strong>in</strong>fixl 6]<strong>in</strong> the same <strong>in</strong>fix expressionPrelude> 2 * (-2) ←↪-4Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 14/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelVergleichsoperationenGleichheitstest == undUngleichheitstest /=größer: >, größer o<strong>der</strong> gleich: >=kle<strong>in</strong>er: 3*10 == 6*5 ←↪TruePrelude> True == False ←↪FalsePrelude> False == False ←↪TruePrelude> 2*8 /= 64 ←↪TruePrelude> 2+8 /= 10 ←↪FalsePrelude> True /= False ←↪TruePrelude> 5 >= 5 ←↪TruePrelude> 5 > 5 ←↪FalsePrelude> 6 > 5 ←↪TruePrelude> 4 < 5 ←↪TruePrelude> 4 < 4 ←↪FalsePrelude> 4


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelFunktionenFunktionen verwenden, Funktionstypen, Funktionen def<strong>in</strong>ierenVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 16/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelFunktionenSei f e<strong>in</strong>e Funktion, die den Rest e<strong>in</strong>er Division mit Rest berechnet.In <strong>der</strong> Mathematik würde man z.B. schreiben: f(10, 3) = 1Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 17/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelFunktionenSei f e<strong>in</strong>e Funktion, die den Rest e<strong>in</strong>er Division mit Rest berechnet.In <strong>der</strong> Mathematik würde man z.B. schreiben: f(10, 3) = 1Schreibweise <strong>in</strong> <strong>Haskell</strong>: f 10 3 o<strong>der</strong> auch (f 10 3)Grund: Man darf <strong>in</strong> <strong>Haskell</strong> partiell anwenden, z.B. (f 10)Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 17/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelFunktionenSei f e<strong>in</strong>e Funktion, die den Rest e<strong>in</strong>er Division mit Rest berechnet.In <strong>der</strong> Mathematik würde man z.B. schreiben: f(10, 3) = 1Schreibweise <strong>in</strong> <strong>Haskell</strong>: f 10 3 o<strong>der</strong> auch (f 10 3)Grund: Man darf <strong>in</strong> <strong>Haskell</strong> partiell anwenden, z.B. (f 10)Obige Funktion heißt <strong>in</strong> <strong>Haskell</strong>: modPassend dazu: div: Ganzzahligen Anteil <strong>der</strong> Division mit RestPrelude> mod 10 3 ←↪1Prelude> div 10 3 ←↪3Prelude> mod 15 5 ←↪0Prelude> div 15 5 ←↪3Prelude> (div 15 5) + (mod 8 6) ←↪5Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 17/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelPräfix und Infix+, *, . . . werden <strong>in</strong>fix verwendet:zwischen den Argumenten, z.B. 5+6mod, div werden präfix verwendet:vor den Argumenten, z.B. mod 10 3Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 18/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelPräfix und Infix+, *, . . . werden <strong>in</strong>fix verwendet:zwischen den Argumenten, z.B. 5+6mod, div werden präfix verwendet:vor den Argumenten, z.B. mod 10 3Präfix-Operatoren <strong>in</strong>fix verwenden:In Hochkommata setzen ( ⇑ + `´z.B. 10 ‘mod‘ 3Infix-Operatoren präfix verwenden:In runde Klammern setzenz.B. (+) 5 6)Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 18/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelFunktionstypen (1)Auch Funktionen haben e<strong>in</strong>en TypFunktion hat mehrere E<strong>in</strong>gaben und e<strong>in</strong>e AusgabeJe<strong>der</strong> <strong>der</strong> E<strong>in</strong>gaben und die Ausgabe haben e<strong>in</strong>en TypVerkettung durch ->Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 19/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelFunktionstypen (1)Auch Funktionen haben e<strong>in</strong>en TypFunktion hat mehrere E<strong>in</strong>gaben und e<strong>in</strong>e AusgabeJe<strong>der</strong> <strong>der</strong> E<strong>in</strong>gaben und die Ausgabe haben e<strong>in</strong>en TypVerkettung durch ->Prelude> :type not ←↪not :: Bool -> BoolPrelude> :type (&&) ←↪(&&) :: Bool -> Bool -> BoolPrelude> :type (||) ←↪(||) :: Bool -> Bool -> Boolnot: E<strong>in</strong>e E<strong>in</strong>gabe vom Typ Boolund Ausgabe vom Typ Bool(&&): Zwei E<strong>in</strong>gaben vom Typ Boolund Ausgabe vom Typ Bool(||): Zwei E<strong>in</strong>gaben vom Typ Boolund Ausgabe vom Typ BoolVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 19/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelFunktionstypen (2)Allgeme<strong>in</strong>: f erwartet n E<strong>in</strong>gaben, dann ist <strong>der</strong> Typ von f:f :: Typ 1}{{}Typ des1. Arguments-> Typ 2}{{}Typ des2. Arguments-> . . . -> Typ n} {{ }Typ desn. Arguments-> <strong>in</strong> Funktionstypen ist rechts-geklammert(&&) :: Bool -> Bool -> Boolentspricht (&&) :: Bool -> (Bool -> Bool)und nicht (&&) :: (Bool -> Bool) -> BoolDas passt zur partiellen Anwendung:(&&) :: Bool -> (Bool -> Bool)True :: Bool------------------------------------((&&) True) :: (Bool -> Bool)-> Typ n+1} {{ }Typ desErgebnissesVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 20/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelFunktionstypen (3)Typen von mod und div:mod :: Integer -> Integer -> Integerdiv :: Integer -> Integer -> IntegerIn Wirklichkeit:Prelude> :type mod ←↪mod :: (Integral a) => a -> a -> aPrelude> :type div ←↪div :: (Integral a) => a -> a -> aIn etwa: Für alle Typen a die Integral-Typen s<strong>in</strong>d,hat mod den Typ a -> a -> aVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 21/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelFunktionstypen (4)Prelude> :type (==) ←↪(==) :: (Eq a) => a -> a -> BoolPrelude> :type ( a -> BoolPrelude> :type ( a -> BoolPrelude> :type (+) ←↪(+) :: (Num a) => a -> a -> aPrelude> :type (-) ←↪(-) :: (Num a) => a -> a -> aVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 22/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelFunktionstypen (5)Die Typen müssen stets passen, sonst gibt’s e<strong>in</strong>en Typfehler:Prelude> :type notnot :: Bool -> BoolPrelude> not ’C’:1:4:Couldn’t match expected type ‘Bool’ aga<strong>in</strong>st <strong>in</strong>ferred type ‘Char’In the first argument of ‘not’, namely ’C’In the expression: not ’C’In the def<strong>in</strong>ition of ‘it’: it = not ’C’Manchmal “merkwürdige” Fehlermeldung:Prelude> not 5:1:4:No <strong>in</strong>stance for (Num Bool)aris<strong>in</strong>g from the literal ‘5’ at :1:4Possible fix: add an <strong>in</strong>stance declaration for (Num Bool)In the first argument of ‘not’, namely ‘5’In the expression: not 5In the def<strong>in</strong>ition of ‘it’: it = not 5Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 23/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelFunktionen selbst def<strong>in</strong>ierenverdopple x = x + xIn <strong>der</strong> Mathematik würde man schreiben verdopple(x) = x + xVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 24/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelFunktionen selbst def<strong>in</strong>ierenverdopple x = x + xIn <strong>der</strong> Mathematik würde man schreiben verdopple(x) = x + xAllgeme<strong>in</strong>:funktion Name par 1 . . . par n = <strong>Haskell</strong> Ausdruckwobeipar i : Formale Parameter, z.B. Variablen x, y, . . .Die par i dürfen rechts im <strong>Haskell</strong> Ausdruck verwendet werdenfunktion Name muss mit Kle<strong>in</strong>buchstaben o<strong>der</strong> e<strong>in</strong>emUnterstrich beg<strong>in</strong>nenVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 24/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelFunktionen selbst def<strong>in</strong>ierenverdopple :: Integer -> Integerverdopple x = x + xIn <strong>der</strong> Mathematik würde man schreiben verdopple(x) = x + xAllgeme<strong>in</strong>:funktion Name par 1 . . . par n = <strong>Haskell</strong> Ausdruckwobeipar i : Formale Parameter, z.B. Variablen x, y, . . .Die par i dürfen rechts im <strong>Haskell</strong> Ausdruck verwendet werdenfunktion Name muss mit Kle<strong>in</strong>buchstaben o<strong>der</strong> e<strong>in</strong>emUnterstrich beg<strong>in</strong>nenMan darf auch den Typ angeben!Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 24/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelFunktion testenPrelude> :load programme/e<strong>in</strong>facheFunktionen.hs ←↪[1 of 1] Compil<strong>in</strong>g Ma<strong>in</strong> ( programme/e<strong>in</strong>facheFunktionen.hs)Ok, modules loaded: Ma<strong>in</strong>.*Ma<strong>in</strong>> verdopple 5 ←↪10*Ma<strong>in</strong>> verdopple 100 ←↪200*Ma<strong>in</strong>> verdopple (verdopple (2*3) + verdopple (6+9)) ←↪84Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 25/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelFallunterscheidung: if-then-elseSyntax: if b then e 1 else e 2verdoppleGerade :: Integer -> IntegerverdoppleGerade x = if even x then verdopple x else xeven testet, ob e<strong>in</strong>e Zahl gerade ist:even x = x ‘mod‘ 2 == 0*Ma<strong>in</strong>> :reload ←↪[1 of 1] Compil<strong>in</strong>g Ma<strong>in</strong> ( programme/e<strong>in</strong>facheFunktionen.hs )Ok, modules loaded: Ma<strong>in</strong>.*Ma<strong>in</strong>> verdoppleGerade 50 ←↪100*Ma<strong>in</strong>> verdoppleGerade 17 ←↪17Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 26/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelFallunterscheidung: if-then-else (2)Verschachteln von if-then-else:jenachdem :: Integer -> Integerjenachdem x = if x < 100 then 2*x elseif x Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 27/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelNoch e<strong>in</strong> Beispielverdoppeln_o<strong>der</strong>_verdreifachen :: Bool -> Integer -> Integerverdoppeln_o<strong>der</strong>_verdreifachen b x =if b then 2*x else 3*x*Ma<strong>in</strong>> verdoppeln_o<strong>der</strong>_verdreifachen True 1020*Ma<strong>in</strong>> verdoppeln_o<strong>der</strong>_verdreifachen False 1030verdoppeln mithilfe von verdoppeln_o<strong>der</strong>_verdreifachen:verdoppeln2 :: Integer -> Integerverdoppeln2 x = verdoppeln_o<strong>der</strong>_verdreifachen True x-- o<strong>der</strong> auch:verdoppeln3 :: Integer -> Integerverdoppeln3 = verdoppeln_o<strong>der</strong>_verdreifachen Trueverdoppeln3: ke<strong>in</strong>e E<strong>in</strong>gabe, Ausgabe ist e<strong>in</strong>e FunktionVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 28/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelHigher-Or<strong>der</strong> FunktionenD.h.: Rückgabewerte dürfen <strong>in</strong> <strong>Haskell</strong> auch Funktionen se<strong>in</strong>Auch Argumente (E<strong>in</strong>gaben) dürfen Funktionen se<strong>in</strong>:wende_an_und_addiere f x y = (f x) + (f y)*Ma<strong>in</strong>> wende_an_und_addiere verdopple 10 20 ←↪60*Ma<strong>in</strong>> wende_an_und_addiere jenachdem 150 3000 ←↪3450Daher spricht man auch von Funktionen höherer Ordnung!Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 29/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelNochmal TypenTyp von wende_an_und_addierewende an und addiere :: (Integer -> Integer) -> Integer -> Integer -> Integerwende an und addiere f x y = (f x) + (f y)Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 30/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelNochmal TypenTyp von wende_an_und_addierewende an und addiere :: (Integer -> Integer)} {{ }Typ von fwende an und addiere f x y = (f x) + (f y)-> Integer} {{ }Typ von x-> Integer} {{ }Typ von y-> Integer} {{ }Typ desErgebnissesVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 30/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelNochmal TypenTyp von wende_an_und_addierewende an und addiere :: (Integer -> Integer) -> Integer -> Integer -> Integerwende an und addiere f x y = (f x) + (f y)Achtung: Im Typ(Integer -> Integer) -> Integer -> Integer -> Integerdarf man die Klammern nicht weglassen:Integer -> Integer -> Integer -> Integer -> Integerdenn das entsprichtInteger -> (Integer -> (Integer -> (Integer -> Integer))).Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 30/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelPolymorphe Typenzweimal_anwenden :: (a -> a) -> a -> azweimal_anwenden f x = f (f x)Da Typvariablen <strong>in</strong> <strong>Haskell</strong> erlaubt s<strong>in</strong>d, spricht man vonpolymorphen TypenFür Typvariablen kann man Typen e<strong>in</strong>setzen!Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 31/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelPolymorphe Typenzweimal_anwenden :: (a -> a) -> a -> azweimal_anwenden f x = f (f x)Da Typvariablen <strong>in</strong> <strong>Haskell</strong> erlaubt s<strong>in</strong>d, spricht man vonpolymorphen Typenz.B. a = IntFür Typvariablen kann man Typen e<strong>in</strong>setzen!zweimal_anwenden :: (a -> a) -> a -> aVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 31/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelPolymorphe Typenzweimal_anwenden :: (a -> a) -> a -> azweimal_anwenden f x = f (f x)Da Typvariablen <strong>in</strong> <strong>Haskell</strong> erlaubt s<strong>in</strong>d, spricht man vonpolymorphen Typenz.B. a = IntFür Typvariablen kann man Typen e<strong>in</strong>setzen!zweimal_anwenden :: (Int -> Int) -> Int -> IntVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 31/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelPolymorphe Typenzweimal_anwenden :: (a -> a) -> a -> azweimal_anwenden f x = f (f x)Da Typvariablen <strong>in</strong> <strong>Haskell</strong> erlaubt s<strong>in</strong>d, spricht man vonpolymorphen Typenz.B. a = IntFür Typvariablen kann man Typen e<strong>in</strong>setzen!zweimal_anwenden :: (Int -> Int) -> Int -> Intz.B. a = Boolzweimal_anwenden :: (a -> a) -> a -> aVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 31/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelPolymorphe Typenzweimal_anwenden :: (a -> a) -> a -> azweimal_anwenden f x = f (f x)Da Typvariablen <strong>in</strong> <strong>Haskell</strong> erlaubt s<strong>in</strong>d, spricht man vonpolymorphen Typenz.B. a = IntFür Typvariablen kann man Typen e<strong>in</strong>setzen!zweimal_anwenden :: (Int -> Int) -> Int -> Intz.B. a = Boolzweimal_anwenden :: (Bool -> Bool) -> Bool -> BoolVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 31/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelPolymorphe Typenzweimal_anwenden :: (a -> a) -> a -> azweimal_anwenden f x = f (f x)Da Typvariablen <strong>in</strong> <strong>Haskell</strong> erlaubt s<strong>in</strong>d, spricht man vonpolymorphen Typenz.B. a = IntFür Typvariablen kann man Typen e<strong>in</strong>setzen!zweimal_anwenden :: (Int -> Int) -> Int -> Intz.B. a = Boolzweimal_anwenden :: (Bool -> Bool) -> Bool -> Boolz.B. a = Char -> Charzweimal_anwenden::((Char->Char)->(Char->Char))->(Char->Char)->(Char->Char)Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 31/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelFormale ParameterGesucht:Funktion erhält zwei E<strong>in</strong>gaben und liefert"Die E<strong>in</strong>gaben s<strong>in</strong>d gleich",wenn die beiden E<strong>in</strong>gaben gleich s<strong>in</strong>d.Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 32/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelFormale ParameterGesucht:Funktion erhält zwei E<strong>in</strong>gaben und liefert"Die E<strong>in</strong>gaben s<strong>in</strong>d gleich",wenn die beiden E<strong>in</strong>gaben gleich s<strong>in</strong>d.Falscher Versuch:sonicht x x = "Die E<strong>in</strong>gaben s<strong>in</strong>d gleich!"Conflict<strong>in</strong>g def<strong>in</strong>itions for ‘x’In the def<strong>in</strong>ition of ‘sonicht’Failed, modules loaded: none.Die formalen Parameter müssen unterschiedliche Namen haben.vergleiche x y =if x == y then "Die E<strong>in</strong>gaben s<strong>in</strong>d gleich!" else "Ungleich!"Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 32/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelRekursion”‘Wer Rekursion verstehen will, muss Rekursion verstehen.”’Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 33/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelRekursionE<strong>in</strong>e Funktion ist rekursiv, wenn sie sich selbst aufrufen kann.f x y z = ... (f a b c) ...o<strong>der</strong> z.B. auchf x y z = ... (g a b) ...g x y = ... (f c d e) ...Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 34/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelRekursion (2)Bei Rekursion muss man aufpassen:endlos_e<strong>in</strong>s_addieren x = endlos_e<strong>in</strong>s_addieren (x+1)endlos_e<strong>in</strong>s_addieren 0--> endlos_e<strong>in</strong>s_addieren 1--> endlos_e<strong>in</strong>s_addieren 2--> endlos_e<strong>in</strong>s_addieren 3--> endlos_e<strong>in</strong>s_addieren 4--> ...endlos_e<strong>in</strong>s_addieren 0 term<strong>in</strong>iert nicht!Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 35/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelRekursion (3)So macht man es richtig:Rekursionsanfang: Der Fall, für den sich die Funktion nichtmehr selbst aufruft, son<strong>der</strong>n abbrichtRekursionsschritt: Der rekursive AufrufDarauf achten, dass <strong>der</strong> Rekursionsanfang stets erreicht wird.Beispiel:erste_rekursive_Funktion x =if x


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelRekursion (4)erste_rekursive_Funktion x =if x 0?Testen:*Ma<strong>in</strong>> erste_rekursive_Funktion 515*Ma<strong>in</strong>> erste_rekursive_Funktion 1055*Ma<strong>in</strong>> erste_rekursive_Funktion 1166*Ma<strong>in</strong>> erste_rekursive_Funktion 1278*Ma<strong>in</strong>> erste_rekursive_Funktion 11Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 37/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelRekursion (5)erste_rekursive_Funktion x =if x


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelRekursion (6)erste_rekursive_Funktion x =if x


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelRekursion (6)erste_rekursive_Funktion x =if x


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelRekursion (7)Warum ist Rekursion nützlich?Man kann damit schwierige Probleme e<strong>in</strong>fach lösen∑Wie geht man vor? (z.B. implementiere f(n) = n i)i=1Rekursionsanfang:Der e<strong>in</strong>fache Fall, für den man die Lösung direkt kennt∑f(0) = 0 i = 0i=0Rekursionsschritt:Man löst ganz wenig selbst, bis das Problem etwas kle<strong>in</strong>er ist.Das (immer noch große) Restproblem erledigt die Rekursion,∑f(n) =n i = x+ n−1 ∑i = n+f(n − 1) (für x > 0)i=0i=0Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 40/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelRekursion: Türme von Hanoi12. . .n − 1nStartstapel Zielstapel HilfsstapelStartsituationVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 41/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelRekursion: Türme von Hanoi12. . .n − 1nStartstapel Zielstapel HilfsstapelZielsituationVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 41/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelBeispiel n = 3123Startstapel Zielstapel HilfsstapelVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 42/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelBeispiel n = 323Startstapel Zielstapel Hilfsstapel1Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 42/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelBeispiel n = 33 2 1Startstapel Zielstapel HilfsstapelVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 42/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelBeispiel n = 313 2Startstapel Zielstapel HilfsstapelVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 42/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelBeispiel n = 312Startstapel Zielstapel Hilfsstapel3Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 42/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelBeispiel n = 3123Startstapel Zielstapel HilfsstapelVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 42/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelBeispiel n = 31Startstapel Zielstapel Hilfsstapel23Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 42/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelBeispiel n = 3Startstapel Zielstapel Hilfsstapel123ke<strong>in</strong>e korrekte LösungVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 42/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelBeispiel n = 3123Startstapel Zielstapel Hilfsstapelzurück zum AnfangVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 42/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelBeispiel n = 3231Startstapel Zielstapel HilfsstapelVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 42/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelBeispiel n = 33 12Startstapel Zielstapel HilfsstapelVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 42/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelBeispiel n = 313 2Startstapel Zielstapel HilfsstapelVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 42/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelBeispiel n = 313 2Startstapel Zielstapel HilfsstapelVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 42/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelBeispiel n = 313 2Startstapel Zielstapel HilfsstapelVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 42/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelBeispiel n = 3123Startstapel Zielstapel HilfsstapelVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 42/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelLösen durch Rekursion: Rekursionanfang1Startstapel Zielstapel Hilfsstapeln = 1: Verschiebe Scheibe von Startstapel auf ZielstapelVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 43/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelLösen durch Rekursion: Rekursionanfang1Startstapel Zielstapel Hilfsstapeln = 1: Verschiebe Scheibe von Startstapel auf ZielstapelVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 43/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelLösen durch Rekursion: Rekursionanfang1Startstapel Zielstapel Hilfsstapeln = 1: Verschiebe Scheibe von Startstapel auf ZielstapelVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 43/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelLösen durch Rekursion: Rekursionsschritt12. . .n − 1nStartstapel Zielstapel HilfsstapelVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 44/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelLösen durch Rekursion: Rekursionsschritt12. . .n − 1nStartstapel Zielstapel Hilfsstapel1. Verschiebe den Turm <strong>der</strong> Höhe n − 1 rekursiv auf den HilfsstapelVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 44/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelLösen durch Rekursion: Rekursionsschritt12. . .n n − 1Startstapel Zielstapel Hilfsstapel1. Verschiebe den Turm <strong>der</strong> Höhe n − 1 rekursiv auf den HilfsstapelVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 44/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelLösen durch Rekursion: Rekursionsschritt12. . .n n − 1Startstapel Zielstapel Hilfsstapel2. Verschiebe Scheibe n auf den ZielstapelVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 44/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelLösen durch Rekursion: Rekursionsschritt12. . .n n − 1Startstapel Zielstapel Hilfsstapel2. Verschiebe Scheibe n auf den ZielstapelVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 44/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelLösen durch Rekursion: Rekursionsschritt12. . .n n − 1Startstapel Zielstapel Hilfsstapel3. Verschiebe den Turm <strong>der</strong> Höhe n − 1 rekursiv auf den ZielstapelVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 44/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelLösen durch Rekursion: Rekursionsschritt12. . .n − 1nStartstapel Zielstapel Hilfsstapel3. Verschiebe den Turm <strong>der</strong> Höhe n − 1 rekursiv auf den ZielstapelVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 44/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelPseudo-Algorithmusverschiebe(n,start,ziel,hilf)1. Wenn n > 1, dann verschiebe(n-1,start,hilf,ziel)2. Schiebe Scheibe n von start auf ziel3. Wenn n > 1, dann verschiebe(n-1,hilf,ziel,start)Rekursionanfang ist bei n = 1: ke<strong>in</strong>e rekursiven AufrufeBeachte: Zwei rekursive Aufrufe pro Rekursionsschritt<strong>Haskell</strong>-Implementierung: SpäterVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 45/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelRekursion, weitere BeispieleBeispiel: n-mal VerdoppelnRekursionsanfang:n_mal_verdoppeln :: Integer -> Integer -> Integern_mal_verdoppeln x n =Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 46/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelRekursion, weitere BeispieleBeispiel: n-mal VerdoppelnRekursionsanfang: n = 0: Gar nicht verdoppelnn_mal_verdoppeln :: Integer -> Integer -> Integern_mal_verdoppeln x n =if n == 0 then xVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 46/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelPattern match<strong>in</strong>g (auf Zahlen)n_mal_verdoppeln :: Integer -> Integer -> Integern_mal_verdoppeln x n =if n == 0 then xelse n_mal_verdoppeln (verdopple x) (n-1)Man darf statt Variablen auch Pattern <strong>in</strong> <strong>der</strong> Funktionsdef<strong>in</strong>itionverwenden, und mehrere Def<strong>in</strong>itionsgleichungen angeben. DiePattern werden von unten nach oben abgearbeitet.n_mal_verdoppeln2 :: Integer -> Integer -> Integern_mal_verdoppeln2 x 0 = xn_mal_verdoppeln2 x n = n_mal_verdoppeln2 (verdopple x) (n-1)Falsch:n_mal_verdoppeln2 :: Integer -> Integer -> Integern_mal_verdoppeln2 x n = n_mal_verdoppeln2 (verdopple x) (n-1)n_mal_verdoppeln2 x 0 = xVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 47/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelGuardsGuards (Wächter): Boolesche Ausdrücke,die die Def<strong>in</strong>ition <strong>der</strong> Funktion festlegenf x1 ... xm| 1. Guard = e1...| n. Guard = enAbarbeitung von oben nach untenErster Guard, <strong>der</strong> zu True auswertet,bestimmt die Def<strong>in</strong>ition.n_mal_verdoppeln3 :: Integer -> Integer -> Integern_mal_verdoppeln3 x n| n == 0 = x| otherwise = n_mal_verdoppeln3 (verdopple x) (n-1)Vordef<strong>in</strong>iert: otherwise = TrueVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 48/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelDie Error-Funktionn_mal_verdoppeln3 :: Integer -> Integer -> Integern_mal_verdoppeln3 x n| n == 0 = x| otherwise = n_mal_verdoppeln3 (verdopple x) (n-1)Was passiert bei negativem n?Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 49/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelDie Error-Funktionn_mal_verdoppeln3 :: Integer -> Integer -> Integern_mal_verdoppeln3 x n| n == 0 = x| otherwise = n_mal_verdoppeln3 (verdopple x) (n-1)Was passiert bei negativem n?error :: Str<strong>in</strong>g -> an_mal_verdoppeln4 :: Integer -> Integer -> Integern_mal_verdoppeln4 x n| n < 0 = error "Negatives Verdoppeln verboten!"| n == 0 = x| otherwise = n_mal_verdoppeln4 (verdopple x) (n-1)*Ma<strong>in</strong>> n_mal_verdoppeln4 10 (-10)*** Exception:<strong>in</strong> n_mal_verdoppeln4: negatives Verdoppeln ist verbotenVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 49/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelBeispielIn e<strong>in</strong>em Wald werden am 1.1. des ersten Jahres 10 Rehe gezählt.Der erfahrene Förster weiß, dass sich im Laufe e<strong>in</strong>es Jahres, dieAnzahl an Rehen durch Paarung verdreifacht. In jedem Jahrschießt <strong>der</strong> Förster 17 Rehe. In jedem 2. Jahr gibt <strong>der</strong> Förster dieHälfte <strong>der</strong> verbleibenden Rehe am 31.12. an e<strong>in</strong>en an<strong>der</strong>en Waldab.Wieviel Rehe gibt es im Wald am 1.1. des Jahres n?Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 50/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelBeispielIn e<strong>in</strong>em Wald werden am 1.1. des ersten Jahres 10 Rehe gezählt.Der erfahrene Förster weiß, dass sich im Laufe e<strong>in</strong>es Jahres, dieAnzahl an Rehen durch Paarung verdreifacht. In jedem Jahrschießt <strong>der</strong> Förster 17 Rehe. In jedem 2. Jahr gibt <strong>der</strong> Förster dieHälfte <strong>der</strong> verbleibenden Rehe am 31.12. an e<strong>in</strong>en an<strong>der</strong>en Waldab.Wieviel Rehe gibt es im Wald am 1.1. des Jahres n?Rekursionsanfang: Jahr 1, 10 ReheanzahlRehe 1 = 10Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 50/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelBeispielIn e<strong>in</strong>em Wald werden am 1.1. des ersten Jahres 10 Rehe gezählt.Der erfahrene Förster weiß, dass sich im Laufe e<strong>in</strong>es Jahres, dieAnzahl an Rehen durch Paarung verdreifacht. In jedem Jahrschießt <strong>der</strong> Förster 17 Rehe. In jedem 2. Jahr gibt <strong>der</strong> Förster dieHälfte <strong>der</strong> verbleibenden Rehe am 31.12. an e<strong>in</strong>en an<strong>der</strong>en Waldab.Wieviel Rehe gibt es im Wald am 1.1. des Jahres n?Rekursionsanfang: Jahr 1, 10 ReheRekursionsschritt: Sei k = Anzahl Rehe am 1.1. des Jahres n − 1anzahlRehe 1 = 10anzahlRehe n =anzahlRehe (n-1)Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 50/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelBeispielIn e<strong>in</strong>em Wald werden am 1.1. des ersten Jahres 10 Rehe gezählt.Der erfahrene Förster weiß, dass sich im Laufe e<strong>in</strong>es Jahres, dieAnzahl an Rehen durch Paarung verdreifacht. In jedem Jahrschießt <strong>der</strong> Förster 17 Rehe. In jedem 2. Jahr gibt <strong>der</strong> Förster dieHälfte <strong>der</strong> verbleibenden Rehe am 31.12. an e<strong>in</strong>en an<strong>der</strong>en Waldab.Wieviel Rehe gibt es im Wald am 1.1. des Jahres n?Rekursionsanfang: Jahr 1, 10 ReheRekursionsschritt: Sei k = Anzahl Rehe am 1.1. des Jahres n − 1{ 3 ∗ k − 17, falls n − 1 ke<strong>in</strong> zweites JahrJahr n:(3 ∗ k − 17)/2, falls n − 1 e<strong>in</strong> zweites JahranzahlRehe 1 = 10anzahlRehe n = if even (n-1)then (3*(anzahlRehe (n-1))-17) ‘div‘ 2else 3*(anzahlRehe (n-1))-17Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 50/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelBeispiel (2)*Ma<strong>in</strong>> anzahlRehe 110*Ma<strong>in</strong>> anzahlRehe 213*Ma<strong>in</strong>> anzahlRehe 311*Ma<strong>in</strong>> anzahlRehe 416*Ma<strong>in</strong>> anzahlRehe 515*Ma<strong>in</strong>> anzahlRehe 628*Ma<strong>in</strong>> anzahlRehe 733*Ma<strong>in</strong>> anzahlRehe 882*Ma<strong>in</strong>> anzahlRehe 9114*Ma<strong>in</strong>> anzahlRehe 10325*Ma<strong>in</strong>> anzahlRehe 503626347914090925Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 51/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelLet-Ausdrücke: Lokale Def<strong>in</strong>itionenanzahlRehe 1 = 10anzahlRehe n = if even (n-1)then (3*(anzahlRehe (n-1))-17) ‘div‘ 2else 3*(anzahlRehe (n-1))-17Mit let:anzahlRehe2 1 = 10anzahlRehe2 n = let k = (3*anzahlRehe2 (n-1))-17<strong>in</strong> if even (n-1) then k ‘div‘ 2else kVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 52/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelLet-Ausdrücke: Lokale Def<strong>in</strong>itionen (2)Allgeme<strong>in</strong>er:let Variable1 = Ausdruck1Variable2 = Ausdruck2. . .VariableN = AusdruckN<strong>in</strong> AusdruckVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 53/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelListen undProgrammieren mit ListenVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 54/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelListenListe = Folge von Elementenz.B. [True, False, False, True, True] und [1,2,3,4,5,6]In <strong>Haskell</strong> nur homogene Listen erlaubt:Alle Elemente haben den gleichen Typz.B. verboten: [True,’a’,False,2]Prelude> [True,’a’,False,2]:1:6:Couldn’t match expected type ‘Bool’ aga<strong>in</strong>st <strong>in</strong>ferred type ‘Char’In the expression: ’a’In the expression: [True, ’a’, False, 2]In the def<strong>in</strong>ition of ‘it’: it = [True, ’a’, False, ....]Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 55/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelListen: TypAllgeme<strong>in</strong>er Typ: [a]Das a bezeichnet den Typ <strong>der</strong> Elementez.B. Liste von Zeichen: Typ [Char] usw.Prelude> :type [True,False][True,False] :: [Bool]Prelude> :type [’A’,’B’][’A’,’B’] :: [Char]Prelude> :type [1,2,3][1,2,3] :: (Num t) => [t]Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 56/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelListen: TypAllgeme<strong>in</strong>er Typ: [a]Das a bezeichnet den Typ <strong>der</strong> Elementez.B. Liste von Zeichen: Typ [Char] usw.Prelude> :type [True,False][True,False] :: [Bool]Prelude> :type [’A’,’B’][’A’,’B’] :: [Char]Prelude> :type [1,2,3][1,2,3] :: (Num t) => [t]Auch möglich:*Ma<strong>in</strong>> :type [verdopple, verdoppleGerade, jenachdem][verdopple, verdoppleGerade, jenachdem] :: [Integer -> Integer]*Ma<strong>in</strong>> :type [[True,False], [False,True,True], [True,True]][[True,False], [False,True,True], [True,True]] :: [[Bool]]Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 56/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelListen erstellenEckige Klammern und Kommas z.B. [1,2,3]Das ist jedoch nur Syntaktischer ZuckerListen s<strong>in</strong>d rekursiv def<strong>in</strong>iert:Typen:”‘Rekursionsanfang”’ ist die leere Liste [] (”‘Nil”’)”‘Rekursionsschritt”’ mit : (”‘Cons”’)x e<strong>in</strong> Listenelementxs e<strong>in</strong>e Liste (mit n − 1 Elementen)Dann ist x:xs Liste mit n Elementen beg<strong>in</strong>nend mit x undanschließend folgen die Elemente aus xs[1,2,3] ist <strong>in</strong> Wahrheit 1:(2:(3:[]))[] :: [a](:) :: a -> [a] -> [a]Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 57/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelInterne Darstellung <strong>der</strong> Listen[1,2,3,4,5] = 1:(2:(3:(4:(5:[])))):1 :2 :3 :4 :5 []Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 58/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelBeispielKonstruiere die Listen <strong>der</strong> Zahlen n, n − 1 . . . , 1:nbis1 :: Integer -> [Integer]nbis1 0 = []nbis1 n = n:(nbis1 (n-1))*Ma<strong>in</strong>> nbis1 0[]*Ma<strong>in</strong>> nbis1 1[1]*Ma<strong>in</strong>> nbis1 10[10,9,8,7,6,5,4,3,2,1]*Ma<strong>in</strong>> nbis1 100[100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32, 31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1]Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 59/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelListen zerlegenVordef<strong>in</strong>iert:head :: [a] -> a liefert das erste Element e<strong>in</strong>er nicht-leeren Listetail :: [a] -> [a] liefert den Schwanz e<strong>in</strong>er nicht-leeren Liste.null :: [a] -> Bool testet, ob e<strong>in</strong>e Liste leer ist*> head [1,2]1*> tail [1,2,3][2,3]*> head []*** Exception: Prelude.head: empty list*> null []True*> null [4]FalseVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 60/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelBeispielFunktion, die das letzte Element e<strong>in</strong>er Liste liefert.letztesElement :: [a] -> aletztesElement xs = if null xs thenerror "Liste ist leer"elseif null (tail xs) then head xselse letztesElement (tail xs)Ma<strong>in</strong>> letztesElement [True,False,True]True*Ma<strong>in</strong>> letztesElement [1,2,3]3*Ma<strong>in</strong>> letztesElement (nbis1 1000)1*Ma<strong>in</strong>> letztesElement [[1,2,3], [4,5,6], [7,8,9]][7,8,9]Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 61/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelListen zerlegen mit PatternInf par 1 . . . par n = rumpfdürfen par i auch sog. Pattern se<strong>in</strong>.Z.B.eigenesHead [] = error "empty list"eigenesHead (x:xs) = xAuswertung von eigenesHead (1:(2:[]))Das erste Pattern das zu (1:(2:[])) passt (”‘matcht”’) wirdgenommenDies ist (x:xs). Nun wird anhand des Patterns zerlegt:x = 1xs = (2:[])Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 62/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelPattern-MatchPattern []Liste[] :1 :2 :3 :4 :5 []Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 63/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelPattern-MatchPattern []Liste[] :passt nicht1 :2 :3 :4 :5 []Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 63/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelPattern-MatchPattern x:xsListe::xxs1 :2 :3 :4 :5 []Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 63/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelPattern-MatchPattern x:xsListe:x1 xs :x = 1xs = 2:(3:(4:(5:[])))2 :3 :4 :5 []Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 63/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelPattern-MatchPattern x:(y:xs)Liste:x :yxs:1 :2 :3 :4 :5 []Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 63/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelPattern-MatchPattern x:(y:xs)Liste:x 1 :x = 1y = 2xs = 3:(4:(5:[]))2 y xs :3 :4 :5 []Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 63/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelBeispiele: Pattern-MatcheigenesNull [] = TrueeigenesNull (x:xs) = False-- alternativ:eigenesNull2 [] = TrueeigenesNull2 xs = False -- matcht immer!-- falsch!:falschesNull xs = FalsefalschesNull [] = TrueWarn<strong>in</strong>g: Pattern match(es) are overlappedIn the def<strong>in</strong>ition of ‘falschesNull’: falschesNull [] = ...Ok, modules loaded: Ma<strong>in</strong>.*Ma<strong>in</strong>> falschesNull [1]False*Ma<strong>in</strong>> falschesNull []False*Ma<strong>in</strong>> eigenesNull []TrueVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 64/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelLetztes Element mit Pattern:letztesElement2 [] = error "leere Liste"letztesElement2 (x:[]) = xletztesElement2 (x:xs) = letztesElement2 xs(x:[]) passt nur für e<strong>in</strong>elementige Listen!Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 65/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelVordef<strong>in</strong>ierte Listenfunktionen (Auswahl)length :: [a] -> Int berechnet die Länge e<strong>in</strong>er Listetake :: Int -> [a] -> [a] erwartet e<strong>in</strong>e Zahl k und e<strong>in</strong>e Listexs und liefert die Liste <strong>der</strong> erste k Elemente von xsdrop :: Int -> [a] -> [a] erwartet e<strong>in</strong>e Zahl k und e<strong>in</strong>e Listexs und liefert xs ohne die <strong>der</strong> ersten k Elemente.(++) :: [a] -> [a] -> [a] ”‘append”’: hängt zwei Listenane<strong>in</strong>an<strong>der</strong>, kann <strong>in</strong>fix <strong>in</strong> <strong>der</strong> Form xs ++ ys verwendet werden.concat :: [[a]] -> [a] glättet e<strong>in</strong>e Liste von Listen. Z.B.concat [xs,ys] ist gleich zu xs ++ ys.reverse :: [a] -> [a] dreht die Reihenfolge <strong>der</strong> Elemente e<strong>in</strong>erListe um.Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 66/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelNochmal Str<strong>in</strong>gs"Hallo Welt" ist nur syntaktischer Zucker für[’H’,’a’,’l’,’l’,’o’,’ ’,’W’,’e’,’l’,’t’]bzw.’H’:(’a’:(’l’:(’l’:(’o’:(’ ’(:’(W’:(’e’:(l’:(’t’:[]))))))))))*Ma<strong>in</strong>> head "Hallo Welt"’H’*Ma<strong>in</strong>> tail "Hallo Welt""allo Welt"*Ma<strong>in</strong>> null "Hallo Welt"False*Ma<strong>in</strong>> null ""True*Ma<strong>in</strong>> letztesElement "Hallo Welt"’t’Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 67/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelFunktionen auf Str<strong>in</strong>gsZ.B.words :: Str<strong>in</strong>g -> [Str<strong>in</strong>g]: Zerlegt e<strong>in</strong>e Zeichenkette<strong>in</strong> e<strong>in</strong>e Liste von Wortenunwords :: [Str<strong>in</strong>g] -> Str<strong>in</strong>g: Macht aus e<strong>in</strong>er Listevon Worten e<strong>in</strong>en e<strong>in</strong>zelnen Str<strong>in</strong>g.l<strong>in</strong>es :: Str<strong>in</strong>g -> [Str<strong>in</strong>g]: Zerlegt e<strong>in</strong>e Zeichenkette<strong>in</strong> e<strong>in</strong>e Liste von ZeilenanzahlWorte :: Str<strong>in</strong>g -> IntanzahlWorte text = length (words text)Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 68/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelPaare und TupelPaare <strong>in</strong> <strong>Haskell</strong>: (e1,e2) z.B. (1,’A’)Die Typen <strong>der</strong> Komponenten dürfen verschieden se<strong>in</strong>.Ma<strong>in</strong>> :type ("Hallo",True)("Hallo",True) :: ([Char], Bool)Ma<strong>in</strong>> :type ([1,2,3],’A’)([1,2,3],False) :: (Num t) => ([t], Char)*Ma<strong>in</strong>> :type (letztesElement, "Hallo" ++ "Welt")(letztesElement, "Hallo" ++ "Welt") :: ([a] -> a, [Char])Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 69/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelPaare und Tupel (2)Zugriffsfunktionen:fst :: (a,b) -> aElement.snd :: (a,b) -> b*Ma<strong>in</strong>> fst (1,’A’)1*Ma<strong>in</strong>> snd (1,’A’)’A’*Ma<strong>in</strong>>nimmt e<strong>in</strong> Paar und liefert das l<strong>in</strong>keliefert das rechte Element e<strong>in</strong>es Paares.Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 70/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelPattern-Match auf PaareneigenesFst (x,y) = xeigenesSnd (x,y) = ypaarSumme (x,y) = x+yVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 71/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelTupelWie Paare, aber mit mehr Komponenten.*Ma<strong>in</strong>> :set +t*Ma<strong>in</strong>> (’A’,True,’B’)(’A’,True,’B’)it :: (Char, Bool, Char)*Ma<strong>in</strong>> ([1,2,3],(True,’A’,False,’B’),’B’)([1,2,3],(True,’A’,False,’B’),’B’)it :: ([Integer], (Bool, Char, Bool, Char), Char)Auch hier kann man Pattern verwenden:erstes_aus_vier_tupel (w,x,y,z) = w-- usw.viertes_aus_vier_tupel (w,x,y,z) = zVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 72/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelTürme von Hanoi <strong>in</strong> <strong>Haskell</strong>12. . .n − 1nStartstapel Zielstapel Hilfsstapel⇒12. . .n − 1nStartstapel Zielstapel HilfsstapelPseudo-Algorithmus:verschiebe(n,start,ziel,hilf)1. Wenn n > 1, dann verschiebe(n-1,start,hilf,ziel)2. Schiebe Scheibe n von start auf ziel3. Wenn n > 1, dann verschiebe(n-1,hilf,ziel,start)Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 73/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelModellierung <strong>in</strong> <strong>Haskell</strong>Stapel s<strong>in</strong>d durchnummeriert(am Anfang start = 1, ziel = 2, hilf = 3)Funktion hanoi erhältZahl n = Höhe des Stapels <strong>der</strong> verschoben werden solldie drei StapelAusgabe: Liste von Zügen.E<strong>in</strong> Zug ist e<strong>in</strong> Paar (x, y)= Schiebe oberste Scheibe vom Stapel x auf Stapel yVorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 74/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelDie Funktion hanoi-- Basisfall: 1 Scheibe verschiebenhanoi 1 start ziel hilf = [(start,ziel)]-- Allgeme<strong>in</strong>er Fall:hanoi n start ziel hilf =-- Schiebe den Turm <strong>der</strong> Hoehe n-1 von start zu hilf:(hanoi (n-1) start hilf ziel) ++-- Schiebe n. Scheibe von start auf ziel:[(start,ziel)] ++-- Schiebe Turm <strong>der</strong> Hoehe n-1 von hilf auf ziel:(hanoi (n-1) hilf ziel start)Starten mitstart_hanoi n = hanoi n 1 2 3Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 75/76


Ausdrücke und Typen Funktionen Rekursion Listen Paare und TupelE<strong>in</strong> Beispiel*Ma<strong>in</strong>> start_hanoi 4[(1,3),(1,2),(3,2),(1,3),(2,1),(2,3),(1,3),(1,2),(3,2),(3,1),(2,1),(3,2),(1,3),(1,2),(3,2)]Vorkurs Informatik SoSe 2013 (04) <strong>Grundlagen</strong> <strong>der</strong> <strong>Programmierung</strong> <strong>in</strong> <strong>Haskell</strong> 76/76

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!