Ich bin ein Neuling für Haskell und ein relativer Neuling für funktionale Programmierung. In anderen (neben Haskell) Sprachen sind Lambda-Formen oft sehr nützlich.
Zum Beispiel in Schema:
%Vor%Erzeugt einen Abschluss (über die Funktion f), um eine Ableitung zu approximieren (bei Wert x, mit Intervall h). Diese Verwendung einer Lambda-Form scheint jedoch bei Haskell aufgrund ihrer teilweisen Anwendung nicht notwendig zu sein:
%Vor%Was sind einige Beispiele, wo Lambda-Formen in Haskell notwendig sind?
Bearbeiten: ersetzte 'Schließung' durch 'Lambda-Form'
Ich werde zwei leicht indirekte Antworten geben.
Betrachten Sie zuerst den folgenden Code:
%Vor%Ich habe das kompiliert, während ich GHC anwies, eine Zwischenrepräsentation zu erstellen, die in etwa eine vereinfachte Version von Haskell ist, die als Teil des Kompilierungsprozesses verwendet wird, um Folgendes zu erhalten:
%Vor%Wenn Sie über die unordentlichen Annotationen und Ausführlichkeiten hinwegsehen, sollten Sie sehen können, dass der Compiler alles in Lambda-Ausdrücke verwandelt hat. Wir können dies als Hinweis darauf ansehen, dass Sie dies wahrscheinlich nicht manuell tun müssen.
Betrachten wir umgekehrt eine Situation, in der Sie möglicherweise Lambdas benötigen. Hier ist eine Funktion, die eine Falte verwendet, um eine Liste von Funktionen zusammenzustellen:
%Vor%Was ist das? Kein Lambda in Sicht! Tatsächlich können wir auch den anderen Weg gehen:
%Vor% Dies ist nicht nur voll von lambdas, es bringt auch zwei Argumente für die Hauptfunktion mit sich, und außerdem foldr
auf alle anwenden. Vergleichen Sie den Typ von foldr
, (a -> b -> b) -> b -> [a] -> b
mit dem obigen; Offensichtlich braucht es drei Argumente, aber oben haben wir es auf vier angewandt! Ganz zu schweigen davon, dass die Akkumulatorfunktion zwei Argumente annimmt, aber wir haben hier ein Lambda mit drei Argumenten. Der Trick ist natürlich, dass beide eine Funktion zurückgeben, die ein einziges Argument benötigt; und wir wenden dieses Argument einfach an Ort und Stelle an, anstatt mit Lambda herumzujonglieren.
All das hat Sie hoffentlich davon überzeugt, dass die beiden Formen gleichwertig sind. Lambda-Formen sind niemals notwendig oder vielleicht immer notwendig, denn wer kann den Unterschied erkennen?
Es gibt keinen semantischen Unterschied zwischen
%Vor%und
%Vor% Der Hauptunterschied zwischen Ausdrucksstil (explizite Lambdas) und Deklarationsstil ist ein syntaktischer Stil. Eine Situation, in der es darauf ankommt, ist, wann Sie eine where
-Klausel verwenden wollen:
Es ist in der Tat möglich, ein beliebiges Haskell-Programm zu schreiben, ohne ein explizites Lambda zu verwenden, indem Sie es durch benannte lokale Funktionen oder eine partielle Anwendung ersetzen.
Siehe auch: Deklaration vs. Ausdrucksstil .
Wenn Sie benannte Curry-Funktionen deklarieren können (z. B. Ihr Haskell deriv-approx
), ist es niemals notwendig , einen expliziten Lambda-Ausdruck zu verwenden. Jeder explizite Lambda-Ausdruck kann durch eine partielle Anwendung einer benannten Funktion ersetzt werden, die die freien Variablen des Lambda-Ausdrucks als erste Parameter verwendet.
Warum man dies im Quellcode machen möchte, ist nicht einfach zu sehen, aber einige Implementierungen funktionieren im Wesentlichen so.
Auch etwas außerhalb des Punktes würde das folgende Umschreiben (anders als das, was ich gerade beschrieben habe) als Vermeiden von Lambda für dich gelten?
%Vor%Wenn Sie eine Funktion nur einmal verwenden, z. Als Parameter für map oder foldr oder eine andere Funktion höherer Ordnung ist es oft besser, ein Lambda als eine benannte Funktion zu verwenden, weil sofort klar wird, dass die Funktion nirgendwo anders verwendet wird - das kann nicht sein, weil es keinen Namen hat. Wenn Sie eine neue benannte Funktion einführen, geben Sie den Benutzern, die Ihren Code lesen, für die Dauer des Bereichs eine andere Erinnerung. Lambdas sind also strenggenommen nicht unbedingt notwendig, aber sie sind oft der Alternative vorzuziehen.
Tags und Links haskell closures scheme higher-order-functions