Strukturierung: Currying und partielle Funktionsanwendung
Currying
Jede Funktion, die mehrere Übergabedaten erhält, kann alternativ auch durch eine Kette von Funktionen dargestellt werden, in der die Übergabedaten nacheinander angenommen werden.
Betrachten wir exemplarisch die in der Erkundung bereits vorgestellte Funktion rabatt
mit
zwei Parametern zur Nutzung der Übergabedaten: prozent und
preis.
;Berechnet den rabattierten Preis (: rabatt (real real -> real)) (define rabatt (lambda (prozent preis) (* preis (- 1 (/ prozent 100)))))Indem wir die zwei Parameter nicht gemeinsam in einem lambda-Ausdruck bündeln, sondern für jeden Parameter einen neuen lambda-Ausdruck schreiben, wird für jedes Übergabedatum eine neue Funktion angelegt.
;Berechnet den rabattierten Preis durch eine gecurryte Funktion (: rabatt-curry (real -> (real -> real))) (define rabatt-curry (lambda (prozent) (lambda (preis) (* preis (- 1 (/ prozent 100))))))
Ein vollständiger Aufruf der durch rabatt-curry
definierten Kette von Funktion sähe entsprechend wie folgt aus:
((rabatt-curry 20) 100)Die innere Funktionsanwendung
(rabatt-curry 20)
stellt dabei eine partielle Funktionsanwendung dar.
Partielle Funktionsanwendung
Durch den beispielhaften Aufruf (rabatt-curry 20)
wird das erste Übergabedatum angenommen und
entsprechend im Funktionskörper für den Parameter prozent festgelegt.
Die zurückgegebene Funktion entspricht somit:
(lambda (preis) (* preis (- 1 (/ 20 100))))Partielle Funktionsanwendung erlauben es somit flexibel spezialisierte Teilfunktionen zu erstellen und somit bereits vorhandenen Programmcode wiederzuverwerten. So lässt sich durch partielle Funktionsanwendung der Funktion
rabatt-curry
beispielhaft
Funktionen erstellen, die übergebene Preise immer mit einem bestimmten Prozentsatz berechnen:
;Funktion rabatt-10 berechnet den um 10 % rabattierten Preis (define rabatt-10 (rabatt-curry 10)) ;Funktion rabatt-25 berechnet den um 25 % rabattierten Preis (define rabatt-25 (rabatt-curry 25))
Aufgabe 1: Autovermietung
Eine Autovermietungsfirma bietet verschiedene Autos in der Preisspanne von 40 € bis 300 € pro Tag an. Beim Mieten eines Autos lassen sich drei verschiedene Versicherungspakete buchen. Die Pakete unterscheiden sich in der Selbstbeteiligung (dem maximalen Betrag, den die Versicherungsnehmer im Schadensfall selbst bezahlen müssen) sowie im Preis.
Versicherungspaket | Selbstbeteiligung | Kosten pro Tag |
---|---|---|
Basic | 1500 € | 0 € |
Medium | 350 € | 15 € |
Premium | 0 € | 30 € |
(a) Erstelle eine geeignete gecurryte Funktion auto-mieten
,
die den Tagespreis für eine Automietung bestimmt.
Die Funktion soll nacheinander die folgenden drei Informationen erhalten:
- Das Alter der fahrenden Person.
- Die Kosten pro Tag für die gewählte Versicherungsart.
- Die Kosten pro Tag für das Auto.
(b) Definiere mithilfe deiner in Aufgabenteil (a) umgesetzten Funktion die folgenden Funktionen:
-
auto-mieten-young
bestimmt bei Übergabe des Versicherungspreises und den Autokosten die Gesamtkosten für Fahrer:innen unter 23 Jahren.
-
auto-mieten-basic
bestimmt bei Übergabe der Autokosten die Gesamtkosten für Fahrer:innen, die mindestens 23 Jahre alt sind und das Versicherungspaket Basic gebucht haben.
-
auto-mieten-medium
bestimmt bei Übergabe der Autokosten die Gesamtkosten für Fahrer:innen, die mindestens 23 Jahre alt sind und das Versicherungspaket Medium gebucht haben.
-
auto-mieten-premium
bestimmt bei Übergabe der Autokosten die Gesamtkosten für Fahrer:innen, die mindestens 23 Jahre alt sind und das Versicherungspaket Premium gebucht haben.