s n h m r u
i

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.

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.

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

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.

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))))

Suche

v
100.137.5.1.1.4 Fachkonzeptthema
Kopieren durch Anklicken

Rückmeldung geben