Fachkonzeptthema
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.
Syntaktisch gelingt dies in Racket, indem mehrere Parameter nicht mehr gemeinsam in einem lambda-Ausdruck
gebündelt werden, sondern für jeden Parameter (p-i
) ein neuer verschachtelter lambda-Ausdruck formuliert wird.
So lässt sich eine Funktion mit n Übergabedaten der Form:
(: function (%1 %2 ... %n -> %r))
(define function
(lambda (p-1 p-2 ... p-n)
... ))
in folgende Form bringen:
(: function-curry (%1 -> (%2 -> (... -> (%n -> %r)))))
(define function-curry
(lambda (p-1)
(lambda (p-2)
(...
(lambda (p-n)
... )...))))
Ein vollständiger Aufruf der durch function-curry
definierten Kette von Funktion sähe mit den Übergabedaten
(d-i
) entsprechend wie folgt aus:
(((...((function-curry d-1) d-2) ... ) d-n-1) d-n)
Diese Art der Funktionskonstruktion ermöglicht es jedoch auch partielle Funktionsanwendungen auszuführen.
Partielle Funktionsanwendung
Mögliche partielle Funktionsanwendung wären entsprechend die folgenden:
;Partielle Funktionsanwendung mit einem Übergabedatum
(function-curry d-1)
;Partielle Funktionsanwendung mit zwei Übergabedaten
((function-curry d-1) d-2)
;...
;Partielle Funktionsanwendung mit n-1 Übergabedaten
((...((function-curry d-1) d-2) ... ) d-n-1)
Jede der partiellen Funktionsanwendungen liefert eine Funktion zurück, die die Parameter
(p-i
) für die bereits übergebenen Daten (d-i
) festgelegt und die fehlenden
Übergabedaten durch die nachfolgende Kette von Funktionen erwartet.
Beispiel
Die Funktion rabatt
mit zwei Übergabedaten:
(: rabatt (real real -> real))
(define rabatt
(lambda (prozent preis)
(* preis (- 1 (/ prozent 100)))))
lässt sich in folgende Form bringen:
(: rabatt-curry (real -> (real -> real)))
(define rabatt-curry
(lambda (prozent)
(lambda (preis)
(* preis (- 1 (/ prozent 100))))))
Die partielle Funktionsanwendung mit dem Übergabedatum 20:
(rabatt-curry 20)
gibt entsprechend die folgende Funktion zurück:
(lambda (preis)
(* preis (- 1 (/ 20 100))))