"as" Schlüsselwort in OCaml

8

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?

    
Vincent Tjeng 05.11.2014, 23:54
quelle

2 Antworten

9

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.

    
Jeffrey Scofield 05.11.2014, 23:58
quelle
5

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.

Die Bindung von

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:

earthfront 13.01.2016 14:36
quelle

Tags und Links