Der Grund dafür ist, dass Strings nicht als Datentyp dargestellt werden wie Listen. Daher ist, während cons (: :) ein Konstruktor ist, ^ nicht . Stattdessen werden Zeichenfolgen als eine niedrigere Ebene ohne rekursive Definition (wie Listen) dargestellt. Es gibt eine Möglichkeit, Zeichenketten als eine Liste von Zeichen zu vergleichen, wobei eine Funktion von SML (die man in OCaml schreiben kann) mit dem Namen "explode" und "implode" verwendet wird, die jeweils eine Zeichenkette in eine Char-Liste aufnehmen und umgekehrt . Hier ist eine Beispielimplementierung von ihnen.
Wenn Sie einen Mustervergleichsausdruck schreiben, können Sie keine willkürlichen Funktionen in Ihren Mustern verwenden. Sie können nur Konstruktoren verwenden, die wie unevaluierte Funktionen aussehen. Zum Beispiel ist die Funktion "+" für Ganzzahlen definiert. Also wird der Ausdruck 1+2
ausgewertet und ergibt 3; Die Funktion "+" wird ausgewertet, daher können Sie nicht auf x+y
abgleichen. Hier ist ein Versuch, eine Funktion für natürliche Zahlen zu definieren, die überprüft, ob die Zahl Null ist:
Das kann nicht funktionieren! Aus dem gleichen Grund kann Ihr Beispiel mit Zeichenfolgen nicht funktionieren. Die Funktion "^" wird in Strings ausgewertet, es ist kein Konstruktor.
Der Abgleich auf x+1
funktioniert nur, wenn Zahlen unevaluierte symbolische Ausdrücke sind, die aus dem nicht bewerteten Operator +
und einer symbolischen Konstante 1
erstellt wurden. Dies ist bei OCAML nicht der Fall. Ganzzahlen werden direkt über Maschinennummern implementiert.
Wenn Sie einem Variantentyp entsprechen, stimmen Sie mit Konstruktoren überein, bei denen es sich um nicht bewertete Ausdrücke handelt. Zum Beispiel:
%Vor% Dies funktioniert, weil der 'a option
-Typ aus einem symbolischen Ausdruck wie Some x
besteht. % Co_de% ist hier keine evaluierte Funktion und gibt einen anderen Wert, sondern einen "Konstruktor", den Sie sich als eine Funktion vorstellen können, die nie ausgewertet wird. Der Ausdruck Some
wird nicht weiter ausgewertet; es bleibt so wie es ist. Nur bei solchen Funktionen können Sie Mustervergleiche durchführen.
Listen sind auch symbolische, unbewertete Ausdrücke, die aus Konstruktoren aufgebaut sind; Der Konstruktor ist Some 3
. Das Ergebnis von ::
ist ein unbewerteter Ausdruck, der nur aus kosmetischen Gründen durch die Liste x :: y :: []
dargestellt wird. Aus diesem Grund können Sie Musterlisten in Listen erstellen.
Aber Sie können sie in Listen konvertieren, indem Sie explode
verwenden. Hier ist Ihre Funktion reverse
mit Mustervergleich mit explode
und ihrem Gegenstück implode
:
Benutze es so:
%Vor%Dies zeigt, dass es für Single-Byte-Zeichen, aber nicht für Multi-Byte-Zeichen funktioniert.
Und hier sind explode
und implode
zusammen mit einer Hilfsmethode:
Tags und Links ocaml