Funktionale Programmierung

Werbung
FB Informatik LS I
–
Funktionale Programmierung
–
Prof. Dr. P. Padawitz
Christian Bockermann, Hubert Wagner
Übungen zur Vorlesung
Funktionale Programmierung
Wintersemester 2007/08
Aufgabenblatt 12
Abgabedatum:
25.01.2008
16.00 Uhr
Aufgabe 12.1 T9-Wörterbuch
(40 Punkte)
In Haskell lassen sich auf einfache Weise eigene Datentypen definieren. Im folgenden soll damit ein
Wörterbuch für die T9-Eingabe von Mobiltelefonen implementiert werden. Dieses Wörterbuch soll als
Baum-Struktur in Haskell implementiert werden. Dazu enthält ein Knoten des Baumes eine Bezeichnung id ∈ {2, . . . , 9}, der entsprechend der gängigen Tastenbelegungen von Mobiltelefonen drei oder
vier Buchstaben zugeordnet wird (z.B. steht 2 für die Buchstaben “A”, “B” und “C”).
Jeder Knoten des Baumes enthält zudem eine Liste von Wörtern und eine Liste {2, . . . , 9} von Kindern.
Auf diese Weise entsteht ein Baum, indem der Pfad von der Wurzel des Baumes zu einem Knoten
einer Folge von Ziffern entspricht. Ein Wort wird nun anhand der Tastenfolge, die für das Wort
gedrückt werden müssen in das Wörterbuch einsortiert, dabei werden Groß- und Kleinbuchstaben
gleich behandelt.
Dem Wort Haskell“ entspricht z.B. die Ziffernfolge [4, 2, 7, 5, 3, 5, 5], daher würde es in den Knoten
”
einsortiert, der diesem Pfad entspricht.
1. Definieren Sie die Wörterbuch-Struktur T9Tree in Haskell, die das zuvor beschriebene Wörterbuch
darstellt.
(10 Punkte)
2. Schreiben Sie eine Funktion add :: String -> T9Tree -> T9Tree, die den angegebenen String
in das Wörterbuch einfügt und das so erweiterte Wörterbuch zurückliefert.
(15 Punkte)
3. Geben Sie eine Haskell-Funktion words :: [Int] -> T9Tree -> [String] an, die für eine
Liste von Zahlen (Tasten), die Wörter aus dem Wörterbuch liefert, die mit diesen Tasten gebildet
werden können.
(15 Punkte)
Aufgabe 12.2 Vervollständigen Sie die folgenden Instanz-Deklarationen:
1.
(20 Punkte)
instance Monad Maybe where
...
(10 Punkte)
2.
instance Monad [] where
...
Hier bezeichnet [] den allgemeinen Listen-Typ [a].
(10 Punkte)
Hinweis: Definieren Sie zunächst die Typen von return und >>= für jede der beiden Instanzen.
Aufgabe 12.3 Typ-Klassen
(20 Punkte)
In der Vorlesung wurde die Typ-Klasse Stack vorgestellt, die die folgenden Operatoren bereitstellten:
class Stack s where
push :: a -> s a -> s a
top :: s a -> a
pop :: s a -> s a
isEmptyStack :: s a -> Bool
showStack :: (Show a) => s a -> String
showStack st = if isEmptyStack st then "!"
else (show (top st)) ++ " - " ++ (showStack (pop st))
Definieren Sie einen Typ ListStack, der die Klasse Stack mit Hilfe einer Liste implementiert.
Aufgabe 12.4 Lazy-Evaluation
(20 Punkte)
Mit Hilfe der lazy evaluation lassen sich einige Probleme sehr effizient lösen, da nur notwendige Berechnungen auch tatsächlich durchgeführt werden (vgl. Vorlesung vom 18.01.2008). Im folgenden soll
dies zur Berechnung von Hammingzahlen genutzt werden.
Eine Zahl n heißt Hammingzahl, wenn es i, j, k ∈ N0 gibt, so dass gilt
n = 2i · 3j · 5k ,
d.h. n hat eine Primfaktorzerlegung mit Faktoren aus {2, 3, 5}. Schreiben Sie eine Haskell-Funktion,
die für eine natürliche Zahl m die erten m Hammingzahlen berechnet.
Herunterladen