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.