Funktionale Programmierung Institut für Programmiermethodik und Compilerbau Dr. Walter Guttmann Übungsblatt 2 2011.10.26 Aufgabe 6: Definiere einen Aufzählungstyp Day der Wochentage und darüber folgende Funktionen: isWorkDay isWeekend theDayAfter areAdjacent :: :: :: :: Day Day Day Day -> -> -> -> Bool Bool Day Day -> Bool ----- ist ein Tag ein Werktag? liegt ein Tag am Wochenende? der folgende Tag sind zwei Tage benachbart? Aufgabe 7: Wandle die Funktionen addmul, add2, ggT, area3, binom und binExp von Übungsblatt 1 durch Currying um, sodaß die Argumente nicht als Tupel sondern der Reihe nach übergeben werden. Definiere die Funktionen ggT, abs, binExp, next und steps von Übungsblatt 1 mit Guards oder Mustern statt Fallunterscheidungen. Aufgabe 8: Betrachte den in Haskell vordefinierten, parametrisierten Datentyp Maybe a. Definiere darüber die Funktion applyM :: (a -> b) -> Maybe a -> Maybe b, die die übergebene Funktion auf den eingebetteten Wert anwendet. Aufgabe 9: Gib die Signaturen der folgendermaßen definierten Funktionen an: zero one x apply f x always x y subst f g x = = = = = Zero Succ Zero f x y f x (g x) Aufgabe 10: Definiere die Vergleichsfunktionen equals, lessthan :: Nat -> Nat -> Bool rekursiv. Definiere die Umwandlungsfunktionen int :: Nat -> Int und nat :: Int -> Nat. Berechne fib 4 und fact 4 gemäß ihren Definitionen mit foldn. Zeige die einzelnen Schritte bei der Auswertung. Aufgabe 11: Gib ein Monoid an, in dem (&&) die zweistellige Verknüpfung ist. Zeige, daß die MonoidEigenschaften erfüllt sind. Aufgabe 12: Es seien Funktionen mit der Signatur f :: Int -> Int g :: Int -> Int -> Int gegeben. Gib die Signatur der durch h x y = f (g x y) definierten Funktion h an. Welche der folgenden Gleichungen stimmen? h = f . g h x = f . (g x) h x y = (f . g) x y Aufgabe 13: √ Definiere die Funktion sqrtn :: Int -> Int, die jede nichtnegative Zahl x auf b xc abbildet, in der Form sqrtn = g . foldn f e für geeignete Funktionen g, f und e. Aufgabe 14: Betrachte die Funktion lastP :: (Nat -> Bool) -> Nat -> Nat. Dabei ist lastP p n die größte Zahl m ≤ n, die das Prädikat p erfüllt. Nimm an, daß p 0 gilt und konstruiere geeignete Funktionen g, f und e, sodaß die Funktion in der Form lastP p = g . foldN f e geschrieben werden kann. Aufgabe 15: Gib die in der Vorlesung gezeigten Gesetze curry (uncurry f) = f uncurry (curry g) = g flip (flip h) = h in punktfreier Notation wieder. Eliminiere dazu die Variablen f, g und h zugunsten der Funktionskomposition (.). Zeige die Gültigkeit dieser punktfreien Gesetze. Aufgabe 16: Definiere zwei verschiedene Funktionen des Typs (a,b) -> (b,a). Gib Funktionen des Typs (Int -> Int) -> Int an, ohne sie in Haskell zu definieren.