Prof. Dr. Manfred Schmidt-Schauß Künstliche Intelligenz/Softwaretechnologie Fachbereich Biologie und Informatik / Institut für Informatik Johann Wolfgang Goethe-Universität Frankfurt am Main Funktionale Programmierung Sommersemester 2003 Aufgabenblatt Nr. 5 Abgabe: Dienstag, 03. Juni 2003 vor der Vorlesung Aufgabe 1 (15 Punkte) Benutzen Sie in dieser Aufgabe folgenden Datentyp für binäre Bäume. data BTree a = BLeaf a | BNode (BTree a) (BTree a) deriving(Show) a) Definieren Sie eine Funktion bfold, die – rekursiv – die Elemente des binären Baumes mit Hilfe eines binären Operators so miteinander verknüpft, daß gerade jedes Vorkommen des Konstruktors BNode durch den gegebenen Operator ersetzt wird. (6 Punkte) b) Definieren Sie eine neue Typklasse HasBinFolding für Datenstrukturen, die sich mittels eines binären Operators zusammen falten“ lassen. (5 Punkte) ” c) Geben Sie Instanzen der Klasse HasBinFolding für BTree und Listen an. (4 Punkte) Aufgabe 2 (15 Punkte) a) Implementieren Sie in Haskell ein Programm, das eine Datei liest und deren Inhalt – mit Zeilennummern versehen – auf der Standardausgabe ausgibt. (9 Punkte) b) Definieren Sie eine Funktion, die als Argumente eine Länge n und eine Zahl erwartet, und einen n Zeichen langen String liefert, so dass die Zahl rechtsbündig in diesem String steht und die übrigen Zeichen durch Leerzeichen ausgefüllt sind. Benutzen Sie diese Funktion für das Programm aus Aufgabenteil a). (6 Punkte) Hinweis: Folgende bereits in der Prelude definierten Funktionen könnten nützlich sein: putStr :: String -> IO () readFile :: FilePath -> IO String -- type FilePath = [Char] lines :: String -> [String] unlines :: [String] -> String zipWith :: (a -> b -> c) -> [a] -> [b] -> [c] 1 Aufgabe 3 (10 Punkte) Überführen Sie folgende list comprehension mit dem in der Vorlesung vorgestellten Verfahren in ZF-freies Haskell. [w | v <- [[x,y] | x <- [1,3..20], y <- [2,4..20], y == x+1] , w <- v] Aufgabe 4 (10 Punkte) Die Prelude beinhaltet die Funktion lookup :: Eq a => a -> [(a,b)] -> Maybe b, die gegeben ein Schlüssel vom Typ a und eine entsprechende Assoziationsliste das Ergebnis Just Wert bzw. Nothing zurück gibt, je nach dem, ob ein (Schlüssel,Wert)-Paar in der Assoziationsliste enthalten ist. Implementieren Sie eine Funktion iiZugriff, die als Argumente einen Schlüssel sowie zwei Assoziationslisten db1 und db2 erwartet, und — nur mittels monadischer Operatoren bzw. der do-Notation, ohne dabei die Funktionen aus dem Modul Maybe oder die Konstruktoren Just und Nothing zu verwenden — einen indirekt-indizierten Zugriff auf db2 wie folgt durchführt: Zunächst wird in db1 mit dem Schlüssel ein lookup durchgeführt. Falls ein Wert gefunden wird, wird dieser Wert als Schlüssel für eine zweite lookup-Operation in db2 verwendet und das Ergebnis zurück gegeben. Zusatzaufgabe: Erweitern Sie iiZugriff so um ein Funktionsargument f, daß vor Rückgabe des Ergebnisses aus db2 die Funktion f darauf angewendet wird. Der Typ von iiZugriff wird dann zu (Eq a, Eq b) => (c -> d) -> a -> [(a,b)] -> [(b,c)] -> Maybe d. 2