Funktionale Programmierung Übungsblatt 4

Werbung
Funktionale Programmierung
Institut für Programmiermethodik und Compilerbau
Dr. Walter Guttmann
Übungsblatt 4
2011.11.09
Aufgabe 27:
Gib die Funktionen kopf und rest an, die Kopfelement und Restliste der übergebenen
Liste liefern.
Definiere die Funktionen fpok und tser, die das letzte Element und die Liste ohne ihr
letztes Element liefern.
Aufgabe 28:
Konstruiere die Funktion isSorted :: [Int] -> Bool, die überprüft ob ihr Argument
aufsteigend sortiert ist.
Aufgabe 29:
Definiere die Funktionen nimm, ohne :: Int -> [a] -> [a], die eine nichtnegative Zahl
n und eine Liste xs erhalten. Dabei liefert nimm n xs die ersten n Elemente von xs und
ohne n xs die übrigen.
Aufgabe 30:
Konstruiere die Funktion scanR zur Berechnung der Zwischenwerte von foldr gemäß
dem Schema scanR ⊕ e [x1 , x2 , . . . , xn−1 , xn ] = [. . . , xn−1 ⊕ (xn ⊕ e), xn ⊕ e, e] mit linearer
Laufzeit in der Länge der Liste.
Aufgabe 31:
Die Funktion zipWith soll zur Funktion lzw (long zipWith) verändert werden, die auch
Listen unterschiedlicher Länge sinnvoll verarbeiten kann. Überlege wie die überstehenden
Elemente berücksichtigt werden können und definiere lzw entsprechend. Das Ergebnis soll
die Länge des längeren Parameters haben. Der Typ von lzw muß ausgehend vom Typ
von zipWith angepaßt werden.
Aufgabe 32:
Zeige, daß die leere Liste [] neutrales Element der Konkatenation (++) ist.
Aufgabe 33:
Gib die Funktion span aus der Vorlesung so an, daß sie nur einmal die Liste durchläuft.
Definiere die gemäß der Spezifikation
partition p xs = (filter p xs, filter (not . p) xs)
gegebene Funktion partition als Instanz von foldr.
Aufgabe 34:
Zeige die Gültigkeit der folgenden Gesetze:
f . const k = const (f k)
sum [x] = x
Aufgabe 35:
Definiere die Funktionen alle von Übungsblatt 3 und isort (insertion sort) aus der
Vorlesung als Instanzen von foldl.
Aufgabe 36:
Beweise die foldl-concat fusion mit struktureller Induktion:
foldl f e . concat = foldl (foldl f) e
Verwende dabei den folgenden, in der Vorlesung gezeigten Spezialfall:
foldl f e (xs ++ ys) = foldl f (foldl f e xs) ys
Herunterladen