Prof. Dr. Manfred Schmidt-Schauß Künstliche Intelligenz/Softwaretechnologie Fachbereich Informatik und Mathematik/ Institut für Informatik Johann Wolfgang Goethe-Universität Frankfurt am Main Einführung in die funktionale Programmierung Wintersemester 2006/2007 Aufgabenblatt Nr. 4 Abgabe: Donnerstag 16. November 2006 vor! der Vorlesung Bitte senden Sie den zu Ihrer Lösung zugehörigen dokumentierten Quellcode auch per Email an [email protected]! Aufgabe 1 (18 Punkte) a) Definieren Sie in Haskell die folgenden Ströme von Zahlen (in String-Darstellung): – Einen Strom b::[String] der positiven Binärzahlen: ["1","10","11","100","101","110","111","1000",...] (4 Punkte) – Einen Strom h::[String] der positiven Hexadezimalzahlen: ["1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","10",...] (4 Punkte) b) Implementieren Sie nun eine Funktion genStream :: [String] -> [String], die ein Alphabet erwartet und den Strom aller über diesem Alphabet gebildeten Zahlen liefert. Z.B. soll genStream ["0","1","2","3","4","5","6","7","8","9"] den Strom der positiven Dezimalzahlen liefern. Definieren Sie mit Hilfe von genStream den Strom der Oktalzahlen über dem Alphabet "0","1","2","3","4","5","6","7". (10 Punkte) Aufgabe 2 (8 Punkte) Definieren Sie in Haskell eine Funktion numbering :: [String] -> String -> String, die als Eingabe einen Strom von Zahlen (in Form von Strings) und einen Text erhält und den Text anhand des ersten Stromes zeilenweise nummeriert und somit wiederum einen Text als Ausgabe liefert. Zur Illustration zwei Beispielaufrufe: *Main> numbering [show x | x <-[1..]] "Zeile 1\nZeile 2\nZeile 3\n" "1Zeile 1\n2Zeile 2\n3Zeile 3\n" *Main> putStr $ numbering [show x | x <-[1..]] "Zeile 1\nZeile 2\nZeile 3\n" 1Zeile 1 2Zeile 2 3Zeile 3 Testen Sie die Funktion numbering unter Verwendung der Ströme aus Aufgabe 1. 1 Aufgabe 3 (12 Punkte) Überführen Sie folgende List Comprehension mit dem in der Vorlesung vorgestellten Verfahren in Haskell ohne List Comprehensions. [w | v <- [[x,y] | x <- [1,3..20], y <- [2,4..20], y == x+1] , w <- v] Aufgabe 4 (12 Punkte) Berechnen Sie jeweils den polymorphen Typ der Ausdrücke • (concat.concat) (6 Punkte) • (.).(.) (6 Punkte) wobei Sie die Typen für concat und (.) verwenden dürfen: concat :: [[a]] -> [a] (.) :: (b -> c) -> (d -> b) -> d -> c Geben Sie auch jeweils die berechnete Typsubstitution an. 2