Zusätzlich hat die Haskell-Definition mit weniger Worten mehr zum Ausdruck gebracht: Die Funktion
f1
ist typsicher, wenn sie mit einem String oder einem beliebigem nicht numerischen Wert aufgerufen wird, gibt es einen Typfehler zur Compilezeit. Außerdem funktioniert die Haskell-Variante ohne weiteres Zutun auch mit unbeschränkt großen Zahlen und beliebig genauen reellen Zahlen.Wobei man dies natürlich nicht aus
f1 = (*)
herauslesen kann.Das stimmt, das zu sehen erfordert Haskell-Vorwissen,
Das ist toll aber in Perl genauso daß man da ein gewisses Vorwissen braucht.
ich hätte den Typen auch ausschreiben können, um es explizit zu machen.
f1 :: Int -> (Int -> Int) f1 = (*)
Die Typsignatur drückt folgendes aus: „f1 ist eine Funktion, die einen Int-Wert entgegen nimmt und eine Funktion zurück gibt, die ebenfalls einen Int-Wert entgegen nimmt und einen Int-Wert zurück liefert“.
Multiplikation ist nicht auf Integer beschränkt. In Perl hat der *
übrigens auch eine weitere Bedeutung die jedoch jeder Perlentwicker sofort sieht am Ausdruck:
*f1 = sub{}; # Typeglob
$x * $x; # Multiplikation
Wichtig zum Verständnis der ganzen Geschichte hier ist auch das Wissen um das statische Verhalten:
state $f3 = f1(3);
was aber auch ohne das Schlüsselwort state
per se so ist. In Perl kann man per local
sogar mit dynamischen Scope arbeiten, hier mal alles zsamme:
local $, = "\n";
sub f1{
my $x = shift;
sub{
my $y = shift;
$x * $y;
}
}
# CODE Referenzen speichern
state $f3 = f1(3);
our $f5 = f1(5);
# CODErefs ausführen
print $f3->(11), $f5->(7), "\n"; # 33 35
do{
local $f5 = f1(50);
print $f5->(10), "\n"; # 500
};
print $f5->(10); # 50
MfG