Programmieren in Haskell Zusammenfassung Programmieren in Haskell 1 Kapitel 1: Einführung • Haskellprogramme sind sehr kurz • Haskell hat hohe Ausdruckskraft (“expressive power”) qsort :: (Ord a) => [a] -> [a] qsort [] = [] qsort (a:as) = qsort [b | b <- as, b < a] ++ [a] ++ qsort [ b | b <- as, b >= a] Programmieren in Haskell 2 Kapitel 2: Wir steigen ein ... • Ausdrücke • Werte • Eingebaute Datentypen (Bool, Int, ...) • Typklassen (Eq, Show, ...) • Neue Datentypen (data) data Einheit = Celsius | Fahrenheit | Kelvin data Temperatur = Temp Float Einheit Programmieren in Haskell deriving (Eq,Show) deriving (Eq,Show) 3 Kapitel 3: Musikantenstadl • Eine Formelsprache für Musik • In Haskell wird gerechnet • Rechnen heißt: Manipulation von Werten nach festgelegten Regeln transponiere transponiere transponiere transponiere transponiere transponiere Programmieren in Haskell i i i i i i (Pause d) (Note t d) (m1 :*: m2) (m1 :+: m2) (Instr y m) (Tempo n m) = = = = = = Pause d Note (t+i) d (transponiere i m1) :*: (transponiere i m1) :+: Instr y (transponiere i Tempo n (transponiere n (transponiere i m2) (transponiere i m2) m) m) 4 Kapitel 4: Syntax und Semantik von Haskell • Datentypen • Variablenbindungen • Musterbindungen • Funktionsbindungen • Bewachte Gleichungen • Lokale Definitionen • Gültigkeitsbereiche • Fallunterscheidungen • Syntaktischer Zucker vs. Kernsprache Programmieren in Haskell 5 queens n = place 1 [1..n] [] [] place c [] ud dd = [[]] place c rs ud dd = [q:qs | q <- rs, not ((q - c) ‘elem‘ ud), not ((q + c) ‘elem‘ dd), qs <- place (c+1) (delete q rs) ((q-c):ud)((q+c):dd) ] delete q (x:xs) = if q == x then xs else x:(delete q xs) Programmieren in Haskell 6 Kapitel 5: Programmieren mit Listen • Eigener Listen-Datentyp • Viele nützliche Funktionen auf Listen • Strukturelle Rekursion (auf Listen) Programmieren in Haskell 7 Kapitel 6: Programmieren mit Listen II • Eingebaute Listen • Sortierfunktionen • Strukturelle Rekursion • Divide-and-Conquer (Teile-und-Herrsche) • Listenbeschreibungen (list comprehensions) Programmieren in Haskell 8 Kapitel 7: foldr und Kolleginnen • Abgespecktes Schema der strukturellen Rekursion • foldl und foldr (:) -> (*) [] -> e a1 :(a2 :· · ·:(an−1 :(an :[]))· · ·) -> a1 *(a2 *· · ·:(an−1 *(an :e))· · ·) Programmieren in Haskell 9 Kapitel 8: Felder • Zugriffe in konstanter Zeit • Funktionstabellierung (z.B. Fibonacci) • Hashing Programmieren in Haskell 10 Kapitel 9: Programmiermethodik • Vom Problem zum Programm • Spezifikation • Lösung (Implementierung; z.B. strukturelle Rekursion) • Verifikation (z.B. strukturelle Induktion) Programmieren in Haskell 11 Kapitel 10: Monaden • Sequenzierung von Berechnungen • Berechnungen, die schiefgehen können • Ein-/Ausgabe in Haskell Programmieren in Haskell 12 Was ist Haskell Haskell • ist eine funktionale Programmiersprache • ist seiteneffektfrei • erfüllt “referential transparency” • folgt einer “outermost“-Reduktionsstrategie • implementiert “lazy evaluation” • ist streng typisiert • ist polymorph • hat ein Klassensystem (Typklassen) Programmieren in Haskell 13 • erlaubt die Definition eigener Datentypen • erlaubt Pattern-Matching • erlaubt gestaffelte Funktionen • erlaubt Funktionen höherer Ordnung • hat eine einfache Kernsprache • hat einigen syntaktischen Zucker • erlaubt lokale Definitionen • hat ein Modul-System Programmieren in Haskell 14 Ihre Aufgabe für die vorlesungsfreie Zeit (a.k.a. Semesterferien Üben, üben, üben! Programmieren in Haskell 15