Ich bin auf einen Haskell-Code gestoßen, der so aussieht:
ps@(p:pt)
Was bedeutet das @
Symbol in diesem Zusammenhang? Ich kann anscheinend keine Informationen bei Google finden (es ist leider schwierig, bei Google nach Symbolen zu suchen), und ich kann die Funktion in der Prelude-Dokumentation nicht finden, daher stelle ich mir vor, dass es sich stattdessen um eine Art syntaktischen Zucker handeln muss.
@
auf dieser Seite erklärt es.Antworten:
Ja, es ist nur syntaktischer Zucker, der
@
als "wie" vorgelesen wird.ps@(p:pt)
gibt Ihnen Namen fürps
p
pt
Ohne das
@
müssten Sie zwischen (1) oder (2) wählen :( 3).Diese Syntax funktioniert tatsächlich für jeden Konstruktor. wenn Sie haben
data Tree a = Tree a [Tree a]
, dannt@(Tree _ kids)
haben Sie Zugriff sowohl auf den Baum und seine Kinder.quelle
Das
@
Symbol wird verwendet, um einem Parameter einen Namen zu geben und diesen Parameter mit einem Muster abzugleichen, das dem folgt@
. Es ist nicht listenspezifisch und kann auch mit anderen Datenstrukturen verwendet werden.Dies ist nützlich, wenn Sie einen Parameter in seine Teile "zerlegen" möchten, während Sie den Parameter als Ganzes noch irgendwo in Ihrer Funktion benötigen. Ein Beispiel, in dem dies der Fall ist, ist die
tails
Funktion aus der Standardbibliothek:quelle
Ich möchte hinzufügen, dass dies
@
auf allen Ebenen funktioniert, was bedeutet, dass Sie dies tun können:Welches wird dann dies produzieren:
((Just 1, Just 2), Just 1, 1, 2)
Im Grunde ist es eine Möglichkeit für Sie, ein Muster an einen Wert zu binden. Dies bedeutet auch, dass es mit jeder Art von Muster funktioniert , nicht nur mit Listen, wie oben gezeigt. Dies ist sehr nützlich zu wissen, da Sie es in vielen weiteren Fällen verwenden können.
In diesem Fall
a
ist das GanzeMaybe Tuple
,b
ist nur der ersteJust
im Tupel undc
undd
sind die Werte, die im ersten bzw. zweitenJust
im Tupel enthalten sindquelle
Um das zu ergänzen, was die anderen Leute gesagt haben, werden sie als Muster bezeichnet (in ML verwendet die Syntax das Schlüsselwort "as") und werden im Abschnitt des Haskell-Berichts über Muster beschrieben .
quelle