Till Mossakowski Stephan Günther Funktionale Programmierung - Fortgeschrittene Konzepte und Anwendungen
WS 2019/20
3. Übungsblatt
Ausgabe: 03.11.19 Abgabe: 06.11.19
3.1 Money Makes The World Go Round
Anstatt eines Tante-Emma Ladens wie in der Vorlesung, modellieren wir in dieser Übung Grundzüge eines Casinos.
Konkret passiert dies in drei Schritten:
(1) Das Casino hat farbige Jetons1zu ein (Rot), fünf (Grün), zehn (Blau), fünfzig (Silber) und hundert (Gold) Euro. Beim Betreten des Casinos kann man Jetons für einen gewünschten Gesamtwert erwerben, und beim Verlassen die Jetons wieder in Euro umtauschen.
Modellieren Sie die Jetons mit einem AufzählungstypJeton, sowie eine Funktion welchen den Wert eines Jetons zurückgibt:
value :: Jeton → I n t
(2) Eine Sammlung von Jetons ist entweder leer, oder besteht aus einem Jeton und einer Sammlung weiterer Jetons. Modellieren Sie dies durch einen rekursiven DatentypJetons. Implementieren Sie außerdem zwei Funktionen
count :: Jetons → I n t payoff :: Jetons → I n t
welche die Anzahl der Jetons in einer Sammlung zählt, und die Jetons auszahlt, indem es den Wert der Sammlung (die Summe der Werte der einzelnen Jetons) in Euro zurückgibt.
(3) Zum Schluss müssen wir noch Jetons kaufen können. Dazu implementieren wir eine Funktion buy :: I n t → Jetons
die eine Sammlung von Jetons zurückgibt, die zusammen den angegeben Wert haben, und gleichzeitig möglichst klein ist (d.h. möglichst wenig Jetons enthält). So können wir¤16 durch Jetons zu 1, 5 und 10 Euro repräsentieren:
count (buy 16) 3 payoff (buy 16) 16 payoff (buy 187) 8 payoff (buy 187) 187
Generell soll gelten: wenns≥0dannpayoff (buy s)==s.
1Das sind die Spielmarken, mit denen gesetzt wird.
— Seite 1 von 2 —
3. Übungsblatt
Funktionale Programmierung - Fortgeschrittene Konzepte und Anwendungen WS 2019/20 ,
3.2 Datumsdatentyp
Implementieren Sie einen algebraischen DatentypDatebestehend aus Tag, Monat und Jahr. Implementieren Sie auch eine Funktiondate, die aus einer zulässigen Kombination von Tag, Monat und Jahr2ein Datum erzeugt:
data Date
date :: I n t → Int−> I n t →Maybe Date date 31 3 1985 Just . . .
date 29 2 1983 Nothing
Implementieren Sie außerdem eine Vergleichsoperation fürDateund eine Stringkonversion, welche das Datum im Formatdd.mm.yyyyanzeigt, und instanziieren Sie damit die TypklassenOrdundShow:
show ( fromJust ( date 23 3 786)) "23.03.0786"
date 15 1 1985≤date 16 1 1985 True date 1 9 1985≤date 11 7 1985 False
Implementieren Sie nun eine Funktion die Stringkonvertierungsfunktion fürDate, die das Datum im erweiter- ten ISO 8601 Format anzeigt.
iso8601 ( fromJust ( date 23 3 786)) "0786−03−23"
3.3 Datatypes & Typeclasses
• Auf Folie 11 des Foliensatzes zur zweiten Vorlesung wurdeBoolals “Der einfachste Aufzählungstyp”
bezeichnet. Können Sie einen noch einfacheren Aufzählungstyp definieren? Wo wird dieser Datentyp im Foliensatz zur letzten, also dritten, Vorlesung erwähnt?
• Implementieren SieEqundOrdInstanzen für Listen.
• Implementieren Sie eineNumInstanz fürBool.
3.4 * Bob’s Aulde Grocery Shoppe’s Kassenbon
Implementieren Sie die Ausgabe des Kassenbons für Bob’s Aulde Grocery Shoppe, so wie er auf Folie 30 des Foliensatzes für die zweite Vorlesung dargestellt wurde.
2Tag und Monat dürfen nicht null oder negativ sein, Monate nicht größer als 12 und Tage nicht mehr als Tage in dem jeweiligen Monat.
Beachten Sie insbesondere die korrekte Behandlung von Schaltjahren.
— Seite 2 von 2 —