Konzepte der Programmierung Programmierkurs 2 Sommer 2012 Universität Konstanz Informatik & Informationswissenschaft Oliver Deussen, Claus Zinn 1. Übungsblatt (Ausgabe: 18. April 2012 — Abgabe: 25. April 2012, 13:30 (vor dem PK2 Kurs)) Zur Beruhigung Auf diesem Übungsblatt kommen bereits Haskell-Sprachelemente vor, die noch nicht klar in der Vorlesung eingeführt worden sind. Es ist also nicht verwunderlich, wenn einige Dinge noch etwas nebulös scheinen. Einteilung in Zweiergruppen Aufgabe 1 Die Übungsaufgaben sollen –bis auf die Zwischenklausur – in Zweiergruppen gelöst werden. Suche einen Übungspartner, und tragt Euch ab Mittwoch (18.4) 15:30 Uhr als Zwei(!)ergruppe in den Listen – die auf Z7 aushängen – für eines der Tutorate ein. Installation von SVN und Haskell Aufgabe 2 Installiere auf Deinem Rechner Subversion1 und mache Dich mit der grundlegenden Funktionalität vertraut. Subversion ist bereits Bestandteil vieler Linux-Distributionen und üblicherweise über die entsprechende Paketverwaltung verfügbar. Auf den Maschinen im Rechnerpool ist Subversion bereits eingerichtet. Das Buch Version Control with Subversion ist online verfügbar2 , zum schnellen Einstieg die Kapitel Creating a Working Copy 3 und Basic Work Cycle 4 lesen. Aufgabe 3 Installiere auf Deinem Rechner den Glasgow Haskell Compiler (GHC). Auch dieser sollte über das Paketsystem Deiner Linux-Distro erhältlich sein, oder Du installierst die HaskellPlatform5 . Außerdem brauchst Du noch einen Texteditor, wie emacs, vi etc. Auf den Maschinen im Rechnerpool sind der GHC und einige Editoren bereits installiert. Erste Erfahrungen mit Haskell und SVN Aufgabe 4 Mit ghci am Shell Prompt startet der interaktive Interpreter des GHC — den Compiler ghc (ohne i) werden wir erstmal nicht benutzen. Am Prompt (Prelude>) können Haskell-Ausdrücke ausgewertet werden. Starte den Interpreter GHCi, und tippe einfache arithmetische Ausdrücke ein. Folge Funktionen sind bereits vordefiniert und sollten von Dir ausprobiert werden: 1. Addition, Subtraktion, Multiplikation, Division: +, -, *, /. 2. Wurzelfunktion: sqrt 3. Ganzzahlige Division: ‘div‘ (z.B. 9 ‘div‘ 2 _ 4. Wichtig: Nicht ’div’, sondern ‘div‘, also ASCII 0x60.) 4. Ganzzahliger Rest: ‘mod‘ (z.B. 12 ‘mod‘ 5 _ 2.) 1 http://subversion.apache.org/ 2 http://svnbook.red-bean.com/ 3 http://svnbook.red-bean.com/nightly/en/svn.tour.initial.html 4 http://svnbook.red-bean.com/nightly/en/svn.tour.cycle.html 5 http://hackage.haskell.org/platform/ Bitte wenden! −−−−−−−−−→ Du kannst Klammern (,) zur Schachtelung der Ausdrücke verwenden. Lass Dich von etwaigen Fehlermeldungen nicht entmutigen. Vermutlich deuten sie auf einen einfachen Tippfehler hin, aber vielleicht bist Du auch auf ein Merkmal von Haskell gestoßen, das wir noch nicht besprochen haben. Merke Dir Fragen und stelle sie während der Tutorate! Subversion Mittlerweile (Voraussetzung: Aufgabe 1) solltest Du eine Mail bzgl. Deiner Übungsteilnahme bekommen, und entsprechend der dortigen Anweisungen das aktuelle Vorlesungsmaterial ausgecheckt haben. Folge den weiteren Hinweisen in der Mail, so findest Du das Haskell Script assignment01.lhs; es spielt eine Rolle in den weiteren Aufgaben. Aufgabe 5 (6 Punkte) Am Prompt des GHCi kann man auch einige Kommandos eingeben, die den Interpreter steuern. :help listet all diese Kommandos auf, :load filename lädt ein Haskell Script, :reload lädt ein zuvor geladenes Script nochmal (z.B. nach Änderungen), und :quit beendet den Interpreter. Man kann solch ein Kommando auch durch sein eindeutiges Prefix abkürzen, also z.B. :l foo.hs statt :load foo.hs. Das Script assignment01.lhs (lesen!) definiert die drei Funktionen xxx, foo, und bar. Lade das Script in den GHCi (mit :load, das GHCi-Prompt ändert sich in *Main>) und teste verschiedene Aufrufe der Funktionen, etwa xxx 10 oder foo 28 12 oder bar 33. Versuche, auf diese Art und Weise herauszufinden, was der Zweck dieser Funktionen ist. Benenne die Funktionen geeignet um und kommentiere sie ausgiebig. Aufgabe 6 (2 Punkte) Probiere aus, ob die 42 in der letzten Zeile der Definition von bar auch durch folgende Ausdrücke ersetzt werden könnte: • x • "text" • 1 ‘div‘ 0 • 1 / "text" Was beobachtest Du? Woran könnte es liegen, dass sich Haskell gerade so verhält? Wichtig Einchecken der Lösungen für die Aufgaben 5 und 6 ( svn add und svn commit) nicht vergessen — siehe Mail!