Funktionale Programmierung Übungsblatt 2

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