Einführung in die funktionale Programmierung Aufgabenblatt Nr. 3

Werbung
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)
Herunterladen