Haskell Language
Funktionsaufrufsyntax
Suche…
Einführung
Haskells Funktionsaufrufsyntax, erläutert ggf. Vergleiche mit Sprachen im C-Stil. Dies richtet sich an Personen, die aus einem Hintergrund in Sprachen im C-Stil nach Haskell kommen.
Bemerkungen
Im Allgemeinen besteht die Regel zum Konvertieren eines Funktionsaufrufs im C-Stil in Haskell in einem beliebigen Kontext (Zuweisung, Rückgabe oder in einem anderen Aufruf eingebettet) darin, die Kommas in der Argumentationsliste im C-Stil durch Leerzeichen zu ersetzen und die Öffnung zu verschieben Klammer aus dem C-style-Aufruf, die den Funktionsnamen und seine Parameter enthält.
Wenn Ausdrücke vollständig in Klammern eingeschlossen sind, können diese (externen) Klammerpaare zur besseren Lesbarkeit entfernt werden, da sie die Bedeutung des Ausdrucks nicht beeinflussen.
Es gibt einige andere Umstände, unter denen Klammern entfernt werden können. Dies wirkt sich jedoch nur auf die Lesbarkeit und die Wartbarkeit aus.
Klammern in einem grundlegenden Funktionsaufruf
Für einen Funktionsaufruf im C-Stil, z
plus(a, b); // Parentheses surrounding only the arguments, comma separated
Dann wird der entsprechende Haskell-Code sein
(plus a b) -- Parentheses surrounding the function and the arguments, no commas
In Haskell sind Klammern nicht explizit für die Funktionsanwendung erforderlich und werden nur zur Begriffsklärung verwendet, wie in der Mathematik. In Fällen, in denen die Klammern den gesamten Text im Ausdruck umgeben, werden die Klammern nicht benötigt, und Folgendes ist ebenfalls gleichbedeutend:
plus a b -- no parentheses are needed here!
Es ist wichtig, sich daran zu erinnern, dass in C-Sprachen die Funktion verwendet wird
Klammern in eingebetteten Funktionsaufrufen
Im vorigen Beispiel benötigten wir keine Klammern, da sie die Bedeutung der Anweisung nicht beeinflussten. Sie sind jedoch häufig in komplexeren Ausdrücken erforderlich, wie im folgenden.
In C:
plus(a, take(b, c));
In Haskell wird dies zu:
(plus a (take b c))
-- or equivalently, omitting the outermost parentheses
plus a (take b c)
Beachten Sie, dass dies nicht gleichbedeutend ist mit:
plus a take b c -- Not what we want!
Da der Compiler weiß, dass take
eine Funktion ist, könnte man denken, dass er die Argumente b
und c
anwenden und das Ergebnis an plus
.
In Haskell übernehmen Funktionen jedoch häufig andere Funktionen als Argumente, und es wird kaum zwischen tatsächlichen Funktionen und anderen Werten unterschieden. Daher kann der Compiler Ihre Absicht nicht einfach annehmen, weil take
eine Funktion ist.
Das letzte Beispiel ist also analog zu dem folgenden Aufruf der C-Funktion:
plus(a, take, b, c); // Not what we want!
Teilanmeldung - Teil 1
In Haskell können Funktionen teilweise angewendet werden. Wir können uns vorstellen, dass alle Funktionen ein einzelnes Argument annehmen und eine modifizierte Funktion zurückgeben, für die dieses Argument konstant ist. Um dies zu veranschaulichen, können wir Funktionen wie folgt zusammenfassen:
(((plus) 1) 2)
Hier wird die Funktion (plus)
auf 1
angewendet, um die Funktion ((plus) 1)
, die auf 2
angewendet wird, und die Funktion (((plus) 1) 2)
. Da plus 1 2
eine Funktion ist, die keine Argumente akzeptiert, können Sie sie als einfachen Wert betrachten. In Haskell unterscheidet man jedoch kaum zwischen Funktionen und Werten.
Um mehr ins Detail zu gehen, ist die Funktion plus
eine Funktion, die ihre Argumente hinzufügt.
Die Funktion plus 1
ist eine Funktion, die ihrem Argument eine 1
hinzufügt.
Die Funktion plus 1 2
ist eine Funktion, die 1
zu 2
addiert, wobei dies immer der Wert 3
.
Teilanmeldung - Teil 2
Als weiteres Beispiel haben wir die Funktion der map
, die eine Funktion und eine Liste der Werte annimmt, und wendet die Funktion auf jeden Wert der Liste:
map :: (a -> b) -> [a] -> [b]
Angenommen, wir möchten jeden Wert in einer Liste erhöhen. Sie können sich entscheiden, Ihre eigene Funktion zu definieren, die ihrem Argument eine hinzufügt, und diese Funktion Ihrer Liste map
addOne x = plus 1 x
map addOne [1,2,3]
Wenn Sie sich aber die Definition von addOne
noch einmal ansehen, werden Klammern hinzugefügt, um sie hervorzuheben:
(addOne) x = ((plus) 1) x
addOne
die Funktion addOne
auf einen beliebigen Wert x
angewendet wird, entspricht sie der teilweise angewendeten Funktion plus 1
die auf x
angewendet wird. Das bedeutet , die Funktionen addOne
und plus 1
identisch sind, und wir können nur durch Ersetzen eine neue Funktion vermeiden definieren addOne
mit plus 1
, Erinnern Klammern zu verwenden , zu isolieren plus 1
als subexpression:
map (plus 1) [1,2,3]