Dr. David Sabel Institut für Informatik Fachbereich Informatik und Mathematik/ Institut für Informatik Johann Wolfgang Goethe-Universität Frankfurt am Main Einführung in die funktionale Programmierung Wintersemester 2010/2011 Aufgabenblatt Nr. 3 Abgabe: Montag, 29. November 2010 vor der Vorlesung Bitte senden Sie den zu Ihrer Lösung zugehörigen Haskell-Quellcode auch per Email an [email protected]! Aufgabe 1 (16 Punkte) a) In Haskell seien die Datentypen Paar und DreiTupel definiert als data Paar a b = P a b deriving(Show) data DreiTupel a b c = T a b c deriving(Show) Implementieren Sie in Haskell eine Funktion erstesUndLetztes, die einen 3-Tupel (vom Typ DreiTupel) erwartet und das Paar (vom Typ Paar) bestehend aus dem ersten und dem letzten Element des 3-Tupels liefert. (4 Punkte) b) In KFPTS seien der Typ Paar und der Typ DreiTupel vorhanden (mit den Konstruktoren P und T). Geben Sie in KFPTS eine Superkombinatordefinition für den Superkombinator erstesUndLetzes an. (4 Punkte) c) Wir nehmen an, in KFPTS gibt es einen Typ Char mit den Konstruktoren ’a’, ’b’, . . .. Werten Sie den Ausdruck erstesUndLetztes (T ((λx.x) ’a’) ((λy.’a’) True) ’b’) in KFPTS-Normalordnung bis zur WHNF aus. (6 Punkte) d) Lassen Sie den Ausdruck aus Aufgabenteil c) im ghci auswerten, wobei Sie die Funktion aus Aufgabenteil a) verwenden können und die Abstraktion in den Argumenten in die Darstellung in Haskell umwandeln müssen. (2 Punkte) 1 Aufgabe 2 (14 Punkte) Der Datentyp Koordinate für zweidimensionale Koordinaten, sei definiert als data Koordinate = Koordinate Float Float deriving(Show) a) Implementieren Sie in Haskell einen Datentyp ZweiDObjekt für zweidimensionale Objekte, hierbei sollten darstellbar sein: – Kreise mit zwei Attributen: Eine Koordinate für den Mittelpunkt und der Radius des Kreises. – Rechtecke mit drei Attributen: Eine Koordinate für die untere linke Ecke des Rechtecks und zwei Attribute für die Kantenlängen des Rechtecks. – Strecken mit zwei Attributen: Koordinaten für Anfang- und Endpunkt. (6 Punkte) b) Implementieren Sie in Haskell eine Funktion umfang :: ZweiDObjekt -> Float, die den Umfang eines ZweiDObjekts berechnet (für Strecken sei deren Länge ihr Umfang). Testen Sie die Funktion mit einigen Werten. (8 Punkte) Aufgabe 3 (20 Punkte) Implementieren Sie in Haskell die folgenden Funktionen auf Listen: • Eine Funktion, die eine Liste von Paaren von Zahlen erhält, die Komponenten der Paare vertauscht und alle Paare entfernt deren beiden Komponenten größer als 100 sind. Z.B. liefert die Funktion für die Eingabe [(10,101),(20,300),(100,102),(101,101)] die Ergebnisliste [(101,10),(300,20),(102,100)] (6 Punkte) • Eine Funktion, die eine Liste von Listen erhält und alle jene inneren Listen umdreht, die mehr als 3 Elemente enthalten. Z.B. ergibt die Eingabe [[1,2,3,4],[5,6,7],[8,9,10,11,12],[13],[14,15],[]] das Ergebnis [[4,3,2,1],[5,6,7],[12,11,10,9,8],[13],[14,15],[]]. (6 Punkte) • Eine Funktion, die eine (i.a. unsortierte) Liste von Zahlen erhält und die drei größten Elemente der Liste als dreielementige Liste liefert. Die Funktion soll dabei die Liste nur einmal durchlaufen, insbesondere sollte die Liste nicht sortiert werden. Z.B. ergibt die Eingabe [4,8,10,1,3,5] das Ergebnis [10,8,5] 2 (8 Punkte)