2016-12-01 5 views
3

Ich habe eine Frage zur Listenverkettung. Die Funktion plus plus (++) Arbeit ist anders mit KlammernKonkatenationsoperator nicht verstehen (++)

(++ "abc") ("xyz") >>> it's xyzabc 
(++) "abc" "xyz" >>> it's abcxyz 

Ich denke, es ist, weil:

(++ "abc") ("xyz") >>> "xyz" ++ "abc" 
(++) "abc" "xyz" >>> "abc" ++ "xyz" 

Aber warum, und jedes Dokument die Rede, dass etwa haben?

Ich fahre fort, mit "Subtrahieren" Funktion zu testen. Das Ergebnis, wie mein erwarten:

(subtract 10) (5) >>> -5 
(subtract) 10 5 >>> -5 
+0

'(op x) => \ a -> ein op x'; '(x op) => \ a -> x op a'; '(op) x y => \ x y -> x op y' – freestyle

+0

@freestyle vielleicht, ich denke schon, aber Sie haben irgendein Dokument über die Funktion (++) zu sprechen? –

+1

https://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-280003.4 – freestyle

Antwort

9

Da ++ ein Operator ist, Haskell es in Infix Lage sein, erwartet. Durch Hinzufügen von Parens auf beiden Seiten wird Haskell angewiesen, es als Präfix-Funktion zu behandeln. Deshalb funktioniert

(++) "abc" "xyz"  -- "abc" ++ "xyz" 

funktioniert so wie es tut. Allerdings nur auf einer Seite eines Bedieners ein paren mit, wie (++ "abc") oder ("abc" ++) ist etwas genannt besondere ein section - es erzeugt im Wesentlichen eine Funktion, die „füllen“ das fehlende Argument

(++ "abc")  -- equivalent to `\x -> x ++ "abc"` 
("abc" ++)  -- equivalent to `\x -> "abc" ++ x` 

Dann würde, (++ "abc") ("xyz") entspricht zu (\x -> x ++ "abc") ("xyz") entspricht "xyz" ++ "abc".

+1

+1, schlagen Sie mich zu finden, die "Abschnitt" -Konzept. Ich denke, es wäre schön, etwas über die "subtrahieren" -Funktion hinzuzufügen, die das OP erwähnt; wie die gleiche Logik nicht gilt, weil subtrahieren eine Funktion und kein Operator ist. (Zeigt den Unterschied zwischen '(-) 10 5' und' (subtrahieren) 10 5'). –

+0

Der letzte sieht falsch aus. (- 2) 1' ist ein Typfehler, da das ein Minus ist. Auch subtrahieren 2 1 ergibt -1.In der Tat ist '(-e)' ein Sonderfall, da es kein Abschnitt ist, gerade weil ein unäres Minus existiert, was zu Konflikten führt :-(subtrahieren "existiert, um diese fehlenden Abschnitte ausdrücken zu können. – chi

+0

@chi Ack. Ich behalte Ich benutze nicht einmal ein unäres Minus in meinem Code, ich bin vollkommen glücklich mit 'negate'. – Alec

0

Beginnen wir mit dem zweiten. Dies ist ein Fall von Präfix Notation. Hier, und wenn Sie die prefix notation der Verwendung von Operatoren kennen, würden Sie das Ergebnis "abcxyz" sehen, um intuitiver zu sein. Bei dieser Darstellung operativer Ausdrücke steht der Operator im Vordergrund, gefolgt von der Operandenfolge, die in diesem Fall zwei ist. So behandelt es "abc" als den ersten Operanden und "xyz" als den zweiten Operanden und führt die Verkettung in der erwarteten Standardweise durch, d. H. Der zweite/rechte Operand wird rechts von dem ersten/linken Operanden hinzugefügt.

Während der erste ist ein Fall von currying. Grundsätzlich kann die Verkettung (++), die eine Mehrfachargumentfunktion ist, gleichermaßen als eine Reihe von Argumentfunktionen ausgedrückt werden, wobei wir durch die Bereitstellung von jeweils einem Argument unsere ursprüngliche Funktion transformieren, die n Argumente benötigt (besser "Ausdruck" lesen). wie in Haskell) in eine andere Funktion, die n-1 Argumente nimmt. Hier wird also die ursprüngliche 2-Argument-Funktion (++) in eine 1-Argument-Funktion (++ "abc") umgewandelt. Jetzt kann es als eine Funktion gelesen werden, die "abc" an irgendeine als Eingabe bereitgestellte Zeichenkette anfügt, was auch durch unsere Ausgabe bestätigt wird.

+0

Es ist wichtig zu beachten, dass Operator-Abschnitte einen Schritt über das Curry hinausgehen.' (++ "abc") ' und '(" abc "++)' sind beide legal, so wie '((++)" abc "), aber' ("abc" (++)) 'ist nicht. Da binäre Operatoren sind, na ja, binary, können Sie das einzelne Argument in jeder Position angeben, nicht nur die erste, wie bei gewöhnlichen Multi-Argument-Funktionen. – chepner