Hallo 1unitedpower,
ich habe kaum Ahnung von Haskell, mit echt funktionalen Sprachen habe ich mich noch nicht wirklich herumgeschlagen.
Ich sehe dies: Das Haskell f1 ist etwas ganz anderes als das Perl- (oder JavaScript-) f1. In Haskell wird mit f1 ein Alias in Prefix-Form für die existierende Infix-Funktion "Multipliziere" gebildet, weiter nichts.
f3 und f5 werden durch das automatische Currying von Haskell aus f1 abgeleitet; aber dafür hättest Du f1 gar nicht gebraucht, man kann auch Infix-Funktionen direkt zu Curry verarbeiten (falls ich das Haskell-Wiki richtig lese...)
Das Perl-f1 (und das JavaScript-f1 des OP) führt dagegen handgemachtes Currying für eine fest vorgegebene Funktion aus. Bei Perl kommt noch das manuelle Beschaffen der Parameter hinzu. Das ist als Einstieg in die Idee "Currying" akzeptabel, aber grundsätzlich nicht gut, es verletzt Separation of Concerns, weil es die Currying-Operation mit der gecurryten Funktion vermengt.
Ein besseres JavaScript-Äquivalent zu deiner eleganten Haskell-Curryspeise sähe wohl so aus:
function curry2(f, x) {
return y => f(x,y);
}
let muli = (x,y) => x*y;
let f3 = curry2(muli, 3);
let f5 = curry2(muli, 5);
Möglicherweise lässt sich das auch in Perl formulieren; ich weiß nicht, ob in Perl subs als Parameter übergeben werden können.
Der Vergleich ist aber auf jeden Fall unfair; natürlich ist Currying in einer funktionalen Sprache viel eleganter als in Sprachen, die dafür keinen fertigen Mechanismus mitbringen.
Rolf
sumpsi - posui - clusi