Funktionszusammensetzung in Perl

8

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?

    
sigidagi 20.08.2012, 12:40
quelle

4 Antworten

10

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

sagen %Vor%

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

    
amon 20.08.2012, 12:50
quelle
9

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

%Vor%

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 .

    
tauli 20.08.2012 13:44
quelle
5

Ich bin mir nicht sicher, dass dies die Antwort ist, nach der Sie gesucht haben:

%Vor%     
choroba 20.08.2012 12:47
quelle
3
%Vor%

compose würde eine sehr einfache Version der Punktfunktion implementieren. Aber wie bereits erwähnt, ist dies nicht unbedingt erforderlich, es sei denn, Sie möchten die Funktion an einen anderen Ort transportieren.

    
Axeman 20.08.2012 16:23
quelle

Tags und Links