Frage

"Programmieren F #" Ich kam über ein Pattern-Matching wie dieser (ich ein wenig vereinfacht):

let rec len list = 
  match list with
  | [] -> 0
  | [_] -> 1
  | head :: tail -> 1 + len tail;;

Praktisch verstehen, ich, dass das letzte Spiel den Kopf und Schwanz der Liste erkennt. Konzeptionell, bekomme ich nicht, warum es funktioniert. Soweit ich verstehe, :: ist der Nachteil Operator, der einen Wert in Kopfposition einer Liste anhängt, aber es mir nicht schauen, wie es hier als Operator verwendet wird. Soll ich dies als eine „spezielle Syntax“ für Listen verstehen, wo :: als Operator oder ein „Übereinstimmungsmuster“ je nach Kontext interpretiert wird? Oder kann die gleiche Idee für andere Typen als Listen erweitert werden, mit anderen Betreibern?

War es hilfreich?

Lösung

Neben Brian Antwort gibt es einige Punkte, die erwähnenswert sind. Die h::t Syntax kann sowohl als Operator verwendet werden und als Muster:

let l = 1::2::[]                    // As an operator
match l with x::xs -> 1 | [] -> 0   // As a pattern

Das bedeutet, dass es ein wenig spezielles Konstrukt ist, weil andere Operatoren (zB +) nicht als Muster verwendet werden (zum Zerlegen auf die Argumente des Betreibers das Ergebnis zurück) - offensichtlich für +, wäre dies nicht eindeutig sein.

Auch ist das Muster [_] interessant, weil es ein Beispiel von verschachtelten Mustern. Es komponiert:

  • _ - Unders Muster, die einen beliebigen Wert übereinstimmt und nicht bindet alle Symbole
  • [ <pattern> ] - Single-Element-Liste Muster, die eine Liste mit einzelnen Elementen passen und stimmen mit dem Elemente der Liste mit dem verschachtelten <pattern>
  • .

Sie könnten auch Schreib match 1::[] with | [x] -> x, die den Wert des einzelnen Elements zurückkehren würde (in diesem Fall 1).

Andere Tipps

Es ist eine spezielle Syntax für Listen. Sie können als diskriminierte Vereinigung der list Art denken so:

type list<'T> =         // '
    | Nil
    | Cons of 'T * list<'T>

, außer dass es eine spezielle Syntax, das macht seine Nil [] und Cons(h,t) h::t sein. Dann ist es nur normal, Pattern-Matching auf eine diskriminierte Vereinigung. Hat diese Hilfe?

(evtl. auch rel="noreferrer">.)

Es wird als Formatierer verwendet oder formal pattern, `Liste‘ ist abgestimmt auf die drei Muster:

[] bedeutet, dass die Liste leer

[_] bedeutet, dass die Liste ein Element hat, da Sie nicht über egal was das Element ist, so setzen Sie einfach _ dort können Sie auch [a].

Kopf :: Schwanz bedeutet, dass die Liste zwei Teile hat: einen Kopf und einen Schwanz.

Sie können die F sehen # Mustervergleich als leistungsfähig, wenn dann sonst Struktur.

scroll top