OCaml-Funktion parameter-Mustervergleich für Zeichenketten
Ich habe versucht, verwenden um eine Zeichenfolge übergeben, um eine umgekehrte Zeichenfolge. Warum kann ich nicht tun:
let rec reverse x =
match x with
| "" -> ""
| e ^ s -> (reverse s) ^ e;;
Dem compiler sagt, es ist ein syntax Fehler. Kann ich nicht ^
zu destructure Parameter?
- Zusätzlich für die unten folgende Erklärung: Wo in der Zeichenfolge sollte der compiler auch split den string? "abc" "a" "bc" oder "ab" "c"
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Grund dafür ist, dass die Saiten sind nicht dargestellt als Datentyp in der gleichen Weise wie Listen. Deshalb, während cons (::) ist ein Konstruktor, ^ ist nicht. Stattdessen werden die Zeichenfolgen dargestellt, die ein niedrigeres Niveau geben, ohne eine rekursive definition (als Listen). Es ist ein Weg, um match-strings wie eine Liste von Zeichen, die mit Hilfe einer Funktion von SML (was man schreiben kann, OCaml), genannt 'explodieren' und 'implode', die-jeweils-einen string in einen char-Liste und Umgekehrt. Hier ist ein Beispiel für die Implementierung von Ihnen.
Wenn Sie schreiben Sie eine pattern-matching-Ausdruck verwenden, können Sie beliebige Funktionen in Ihrem Muster. Sie können nur Konstruktoren, die Aussehen wie ungewichtete Funktionen. Zum Beispiel der Funktion "+" definiert ist, auf ganze zahlen. Der Ausdruck
1+2
wird ausgewertet und ergibt 3; die Funktion "+" evaluiert, so dass Sie nicht aufx+y
. Hier ist ein Versuch, zu definieren, eine Funktion auf natürlichen zahlen, der prüft, ob die Zahl null ist:Kann das nicht funktionieren! Aus dem gleichen Grund, dein Beispiel mit strings arbeiten kann. Die Funktion "^" bewertet, strings, es ist kein Konstruktor.
Dem matching auf
x+1
würde nur funktionieren, wenn die zahlen wurden ungewichtete symbolische Ausdrücke aus der ungewichtete Betreiber+
und eine symbolische Konstante1
. Dies ist nicht der Fall in OCAML. Ganzzahlen implementiert werden direkt durch den Computer zahlen.Wenn Sie einen variant-Typ passt Sie auf Konstruktoren, die ungewichtete Ausdrücken. Zum Beispiel:
Dies funktioniert, da die
'a option
Typ ist ein symbolischer Ausdruck, wieSome x
. HierSome
ist nicht eine Funktion, die ausgewertet wird, und gibt einen anderen Wert, sondern eher ein "constructor", die man sich vorstellen kann wie eine Funktion, die nie ausgewertet. Der AusdruckSome 3
wird nicht bewertet, jede weitere; es bleibt, wie es ist. Es ist nur auf solche Funktionen, können Sie pattern-match.Listen sind auch symbolische, ungewichtete Ausdrücke aufgebaut aus Konstruktoren; der Konstruktor ist
::
. Das Ergebnisx :: y :: []
ist eine ungewichtete Ausdruck, diese vertreten durch die Liste[x;y]
nur für kosmetische Bequemlichkeit. Aus diesem Grund, können Sie pattern-match auf den Listen.Als Kristopher Micinski erklärt, kann man nicht zerlegen strings mit pattern-matching, wie Sie mit Listen.
Aber Sie können konvertieren Sie Sie in Listen, mit
explode
. Hier ist Ihrereverse
Funktion mit pattern-matching mitexplode
und sein Gegenstückimplode
:Verwenden Sie es wie diese:
Was zeigt, dass es funktioniert für single-byte-Zeichen, aber nicht für multi-byte-ones.
Und hier sind
explode
undimplode
zusammen mit einem Helfer-Methode: