OCaml Funktion Parameter Mustervergleich für Strings

8

Ich habe versucht, eine Zeichenfolge einzugeben, um eine umgekehrte Zeichenfolge zu erhalten. Warum kann ich das nicht tun:

%Vor%

Der Compiler sagt, es ist ein Syntaxfehler. Kann ich ^ nicht zum Destrukturieren von Parametern verwenden?

    
lkahtz 25.03.2012, 18:57
quelle

3 Antworten

15

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.

    
Kristopher Micinski 25.03.2012, 19:02
quelle
1

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:

%Vor%

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.

    
winitzki 27.03.2012 10:03
quelle
1
Kristopher Micinski erklärt , können Sie nicht Mustervergleich für Strings, da sie keine Listen sind.

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 :

%Vor%

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:

%Vor%     
Matthias Braun 25.09.2017 20:15
quelle

Tags und Links