In den Antworten zu den Tutorials für OCaml finden Sie unter diese Seite einige der Lösungen, einschließlich der einen zum Eliminieren aufeinanderfolgender Duplikate von Listenelementen wird wie folgt geschrieben:
%Vor% Was ist die Relevanz der Zeile a :: (b:: _ as t)
? Warum kann ich es nicht als a :: b :: t
schreiben?
Das t
in b :: _ as t
ist an b :: _
gebunden. Die Bedeutung ist also anders. Wenn Sie das Muster a :: b :: t
verwenden, müssten Sie compress (b :: t)
sagen, was etwas weniger elegant und ein bisschen weniger effizient ist.
Das Schlüsselwort as
bindet einen Namen an das gesamte oder einen Teil eines Musters. Einmal gebunden, kann der Name anstelle des dargestellten Musters verwendet werden. In Ihrer "compress" -Funktion ist t
an das Muster b :: _
gebunden.
Sobald t
gebunden ist, kann es in nachfolgenden Ausdrücken verwendet werden, wie im Rest der "compress" -Funktion.
as
name erfolgt von links nach rechts, im Gegensatz zu den meisten anderen Sprachen (mit Ausnahme von Cs typedef). Außerdem scheint ::
eine höhere Priorität als as
zu haben.
Daher entspricht (b :: _ as t)
((b :: _) as t)
. Dies kann für diejenigen, die von rechts nach links gebunden sind, verwirrend sein. Beachten Sie, dass a :: (b :: _) as t
aufgrund der oben genannten Priorität das gesamte Muster a :: b :: _
an t
bindet.
Referenz:
Tags und Links pattern-matching ocaml