Was die Klammern bedeuten in (x:xs) beim pattern matching?
wenn Sie split eine Liste mit x:xs syntax warum ist es verpackt in einer Runden Klammern? was ist die Bedeutung der Klammern? warum nicht [x:xs] oder einfach x:xs?
- Haben Sie ein Beispiel, wo es gewickelt ist, in ()? x:xs verwendet werden können zur Beschreibung einer Liste mit der Liste das erste element. [x:xs] wäre eine Liste mit der Liste x:xs in es.
- Er sagt über pattern-matching, nicht über den Bau Liste.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die cons-Zelle muss nicht die eingeklammerte in jedem Kontext, aber in den meisten Kontexten ist es denn
Funktion Anwendung bindet stärker als alle infix-operator.
Brennen in Ihrem Gehirn, in Briefen des Feuers.
Beispiel:
Wenn Klammern weggelassen, würde der compiler denken, Sie hätten ein argument
x
gefolgt von einem schlecht platziert infix-operator, und würde es beklagen sich bitter. Auf der anderen Seite ist dies OKIn diesem Fall weder
x
nochxs
kann möglicherweise so ausgelegt werden, als Teil einer Funktion-Anwendung, so dass keine Klammern benötigt werden.Beachten Sie, dass die gleiche wunderbare Regel Funktion Anwendung bindet stärker als alle infix-operator ist, was uns erlaubt, uns zu schreiben
length xs
im1 + length xs
ohne Klammern. Der infix-Regel gibt und das infix Regel nimmt.Du bist einfach mit dem cons-operator
:
, das hat niedrige Priorität. Klammern sind erforderlich, so dass die Dinge Recht zu bleiben.Und Sie nicht verwenden
[x:xs]
, denn das wäre mit einer Liste, deren einziges element einer Liste mit Kopfx
- und tail -xs
.[x:xs]
Muster, aber natürlich hast du Recht; es entspricht einem singleton-Liste auf der obersten Ebene. Die desugared notation der Muster wäre:((x:xs):[])
.Weiß ich nicht genau beantworten, aber ich denke, das ist wegen dem, was abgeglichen werden kann, in den mustern. Nur Konstruktoren abgestimmt werden können. Konstruktoren können einzelne Wörter oder zusammengesetzte. Blick auf die nächste code:
Einziges Wort Konstruktoren entsprechen, wie Sie ist. Aber composite-Konstruktoren müssen umgeben sein, die mit Klammern um, um Mehrdeutigkeiten zu vermeiden. Wenn wir überspringen parens es sieht aus wie matching-gegen zwei unabhängige Argumente:
So, als
(:)
composite-es muss in Klammern. Überspringen parens fürBar
ist eine Art syntaktischer Zucker.UPDATE: ich erkannte, dass (wie sykora angegeben) es ist eine Folge von Operatoren. Es klärt meine Annahmen. Funktion Anwendung (das ist nur der Raum zwischen Funktion und argument) hat höchste Priorität. Andere, einschließlich (:) haben niedrigere Priorität. So
f x:xs
wird interpretiert als((:) (f x)) xs
das ist vermutlich nicht das, was wir brauchen. Währendf (x:xs)
wird interpretiert alsf
angewendetx:xs
was wiederum(:)
angewendetx
undxs
.Geht es um die Analyse.
Erinnern,, der Doppelpunkt : ist nur ein Konstruktor, der geschrieben wird mit dem operator-syntax. So eine Funktion wie
könnte auch geschrieben werden als
Wenn Sie die drop-Klammern in der letzten Zeile, wird es sehr schwer zu analysieren!
:
ist ein Daten-Konstruktor, wie bei jedem anderen Muster übereinstimmen, aber geschrieben infix. Die Klammern sind rein, weil infix Vorrang; Sie sind eigentlich nicht erforderlich und kann sicher ausgelassen werden, wenn die Vorrang-Regeln erlauben. Zum Beispiel:Interessant, dass scheint nicht zu funktionieren im Kopf eines lambda. Nicht sicher, warum.
Wie immer, die "nebeneinander" - operator bindet stärker als alles andere, so dass mehr als oft nicht, sind die Trennzeichen notwendig, aber Sie sind nicht wirklich Teil des pattern-match--sonst wärst du ja nicht in der Lage, verwenden Sie Muster wie
(x:y:zs)
statt(x:(y:zs))
.