Funktionale Programmierung Aufgabenblatt Nr. 5 Aufgabe 1 (15

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