i

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.

Currying ist die Transformation einer Funktion mit mehreren Übergabedaten in eine Kette von Funktion, die immer nur ein einzelnes Übergabedatum erhalten und jeweils eine Funktion zurückliefern, die das nächste Übergabedatum akzeptiert.

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

Bei der partiellen Funktionsanwendung wird eine Funktion mit weniger Übergabedaten aufgerufen, als diese eigentlich benötigt. Das Rückgabedatum einer partiellen Funktionsanwendung ist eine neue Funktion, die die restlichen Übergabedaten erwartet.

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

Bestehende Datei - currying.rkt

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 €
Zusätzlich gibt es eine besondere Regel für alle Fahrer:innen unter 23 Jahren. Diese zahlen beim Hinzubuchen einer Versicherung den 1,5-fachen Betrag des Versicherungspakets.

(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:

  1. Das Alter der fahrenden Person.
  2. Die Kosten pro Tag für die gewählte Versicherungsart.
  3. Die Kosten pro Tag für das Auto.

(b) Definiere mithilfe deiner in Aufgabenteil (a) umgesetzten Funktion die folgenden Funktionen:

  1. auto-mieten-young bestimmt bei Übergabe des Versicherungspreises und den Autokosten die Gesamtkosten für Fahrer:innen unter 23 Jahren.

  2. 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.

  3. 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.

  4. 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.

Suche

v
100.137.5.1.1.2 Strukturierung: Currying und partielle Funktionsanwendung
Kopieren durch Anklicken

Rückmeldung geben