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]


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow