In Perl 5 können wir funktionale Programmiertechniken anwenden (mit Verschlüssen, Funktionen höherer Ordnung wie map, grep usw.). Aber wie steht es mit der Funktionszusammensetzung? Nehmen wir an, in Haskell kann das sehr einfach mit (.) Function gemacht werden:
%Vor%Was wäre eine solche "Punktfunktion" in Perl?
Leider kenne ich Haskell nicht.
Aber die Funktionszusammensetzung setzt die Ausgabe einer Funktion im Wesentlichen als Argument in die nächste Funktion.
output = (negate . abs)(input)
ist dasselbe wie output = negate(abs(input))
. In Perl sind Parens oft optional, und die Eingabe ist implizit in der Funktion map
, also können wir einfach
Übersetze das jetzt einfach in die Perl-Syntax und wir haben
%Vor%für die mathematische / algebraische Negation und
%Vor% für die logische Negation (das ist natürlich das gleiche wie map {! $_} (1,2,3)
).
Ok, zuerst schauen wir uns die Funktionssignatur von (.) in Haskell an:
%Vor%Dies ist einfach wie folgt implementiert
%Vor%Eine Implementierung in Perl könnte dann so aussehen
%Vor% Jetzt implementieren wir die Funktion negate
like this
Und wir sind bereit, es so zu benutzen
%Vor%Aber wie Sie aus den anderen Antworten sehen können, gibt es einfachere Möglichkeiten, dies zu tun. Was Sie sich wirklich fragen sollten ist, warum sollten Sie das wollen. Haskel hat mehrere Eigenschaften, die die Funktionszusammensetzung wirklich nützlich machen. In Perl fühlt es sich jedoch sehr klobig und unbeholfen an.
Wenn Sie daran interessiert sind, welche Arten von funktionaler Programmierung Perl wirklich gut ist, empfehle ich das Buch Perl höherer Ordnung .
Tags und Links perl functional-programming