Mehrfachauswahl mit einem Musterabgleich
Eine tagesabhängige Preisgestaltung betrachten
Nach einer Erhebung hängt die Auslastung des Freibads sehr stark vom Wochentag ab. Die neue Preisgestaltung soll für eine gleichmäßigere Auslastung sorgen.
Eintrittspreise: Kinder unter 10 Jahren zahlen keinen Eintritt. Der Grundpreis ab 10 Jahren beträgt (bis 3 Stunden): MO, DI, MI: 4 € DO, FR : 5 € SA, SO : 6 € Zuzahlung (ab 3 Stunden): Die Zuzahlung ab 10 Jahre beträgt für jede angefangene Stunde 1 €.
Aufgabe 1
Hier eine Implementierung des Grundpreises ab 10 Jahre mit Hilfe geschachtelter Fallunterscheidungen. Ergänze sie um mindestens einen weiteren Tag.
grundpreisAb10: String -> Int
grundpreisAb10 tag =
if (tag == "MO") then
4
else if (tag == "DI") then
4
else
...
Musterabgleich
Mit einem case
-Ausdruck kann man den Ausdruck vereinfachen,
sofern nur bestimmte Musterwerte abgetestet werden.
Man spricht hier von Musterabgleich oder pattern matching.
Beachte, dass der Fall _ -> 0
alle vorher nicht abgedeckten Musterwerte umfasst.
grundpreisAb10: String -> Int
grundpreisAb10 tag =
case tag of
"MO" -> 4
"DI" -> 4
"MI" -> 4
"DO" -> 5
"FR" -> 5
"SA" -> 6
"SO" -> 6
_ -> 0
Ausblick
Die Modellierung ist hier nicht optimal. Wir zählen alle möglichen Wochentage auf, müssen uns aber dennoch darum kümmern, was bei einem ungültigen Wert passiert. Das ist prinzipiell auch gut, damit unser Programm bei einer ungültigen Eingabe einen klar definierten Wert liefert. Wir könnten auch den Fall "SO" weglassen und im _ - Fall den Wert 6 zurück geben. Allerdings würde dieser Wert dann auch bei ungültigen Zeichenketten zurückgegeben werden. Wünschenswert wäre es, wenn wir verhindern könnten, dass man einen ungültigen Wochentag an die Funktion übergibt. Dies kann man mit Hilfe selbst definierter Datentypen erreichen. Wie dies funktioniert lernst du in einem späteren Kapitel.
Aufgabe 2
Teste diese Funktionsdefinition in der REPL. Teste dabei auch unsinnige Tagesangaben.
Teste auch die Wirkung, wenn man in der Implementierung den _ -> 0
Zweig weglässt.
Aufgabe 3
Vervollständige die Implementierung des oben beschriebenen Preismodells.
grundpreisAb10: String -> Int
grundpreisAb10 tag =
case tag of
"MO" -> 4
"DI" -> 4
"MI" -> 4
"DO" -> 5
"FR" -> 5
"SA" -> 6
"SO" -> 6
_ -> 0
-- evtl. weitere Funktionen
eintrittspreis: ...
eintrittspreis alter tag stunden =
...