Springe zum Inhalt

Lambda Expressions – Namenlose Funktionen

In den folgenden Programmieraufgaben soll der Einsatz der Sonderform lambda in Scheme veranschaulicht werden, die Prozeduren erzeugt. Jedoch wird, im Gegensatz zur Definition einer Prozedur mit „define“ kein Name angegeben. Der folgende Artikel führt lambda-Ausdrücke anhand einfacher praktischer Beispiele und Scheme-Quellcode ein. 

lambda-Ausdrücke in Scheme

Programmieraufgabe – „Konstanten-Addierer“

Aufgabenstellung:

  • Es soll eine Prozedur geschrieben werden (z.B. mit ‚constantAdd‘ benannt) die einen Parameter (die Konstante) übergeben bekommt. Als Resultat soll eine neue Funktion zurückgegeben werden, welche wiederum einen eigenen Paramter erwartet.
  • Die Prozedur soll so angewendet werden können, dass z.B. eine Prozedur „plus 7“ ohne parameter definiert werden kann, welche die Erste aufruft. Dieser neuen Funktion kann (trotz Definition ohne Argument) ein Wert übergeben werden, auf den die Konstante addiert wird.

 

Lösung:

Im folgenden der Quellcode der Lösung:

#lang racket

;Definition of a function with one argument that returs another function 
;which expects one argument 
(define (constantAdd n)
  ;nameless lambda expression is our return-value - oit expects one argument
  (lambda (a) 
    (+ a n)))

(define plus7 (constantAdd 7))

; function call

(plus7 2)

Im Rumpf der Funktion „constantAdd“ wird eine lambda-Funktion mit einem Parameter definiert. Beim Aufruf von „constantAdd“ durch eine Parameterlose Funktion wird ein angegebener Übergabewert direkt an die lambda-Funktion weitergegeben.

Schme-Lambda-Expression

Wie im folgenden Beispiel gut zu erkennen ist wird nur ein Parameter akzeptiert und eine falsche Anzahl führt zu einer Fehlermeldung und wird nicht etwa ignoriert.

Schme-Lambda-Expression-2

let-Ausdrücke

Es kommt häufig vor, dass in einer Prozedur, zusätzlich zu den formalen Parametern, weitere lokale Variable brauchen (z.B. für Zwischengrößen). In einem konkreten Beispiel soll folgende Formel berechnet werden:

Latex formula

Welche auch folgendermaßen formuliert werden kann:

Latex formula

 

Latex formula

 

Latex formula

 

Lösungsvarianten:

Im Folgenden Codeabschnitt sind drei verschiedene Lösungsvarianten aufgeführt. Im ersten Beispiel wird mit einer Hilfsfunktion gearbeitet, welcher die Parameter a,b übergeben werden.

Im zweiten Beispiel wird der lambda-Ausdruck verwendet, wobei die Werte für die Parameter a und b an die lambda-Funktion übergeben werden.

Im dritten Beispiel wird schliesslich der let-Ausdruck verwendet, also das implizite lambda, wobei zunächst die lokalen Variablen a und b, durch x und y ausgedrückt, definiert werden um im Anschluss schließlich die Formel zu berechnen. Der Geltungsbereich der lokalen Variablen liegt also im Rumpf des let-Ausdruckes.

#lang racket
(define (quadrat x) (* x x))

; Variante mit Hilfsfunktion
(define (funktion x y)
  (define (hilfsfunktion a b)
    (+ (* x (quadrat a))
       (* y b)
       (* a b)))
  (hilfsfunktion (+ 1 (* x y)) (- 1 y)))


;variante mit normalem lambda-Ausdruck
(define (funktion-alt1 x y)
  ((lambda (a b)
     (+ (* x (quadrat a))
        (* y b)
        (* a b)))
   (+ 1 (* x y))
   (- 1 y)))

;Variante mit let-Ausdruck (= impliziter lambda-Ausdruck)
(define (funktion-alt2 x y)
  (let ((a (+ 1 (* x y)))
        (b (- 1 y)))
    (+ (* x (quadrat a))
       (* y b)
       (* a b))))

Schließlich sollen die Formeln noch einmal berechnet werden um zu zeigen, dass in allen drei Fällen das korrekte Ergebnis berechnet wird:

Schme-Lambda-Expression

 

Veröffentlicht inRacket / MIT SchemeScheme-AlgorithmenTechnik und Technologie

Sei der Erste der einen Kommentar abgibt

Schreibe einen Kommentar