Im Moment habe ich eine verschachtelte Musterübereinstimmung, die sich merkwürdig verhält.Warum funktioniert dieser verschachtelte F # -Match-Ausdruck nicht richtig?
Hier ist der Code-Snippet
match setting with
| "-f" | "--file" -> // Open file
({ state with file = Some (cur_dir + "\\" + elem) }, "")
| "" -> // Option without parameter
match elem with
| "-h" | "--help" -> // Display help message
({ state with help = true }, "")
| "-r" | "--readonly" -> // Open with readonly
({ state with readonly = true }, "")
| opt -> (state, opt)
| _ -> (state, "") // Ignore invalid option
Leider habe ich zwei Warnungen, wenn ich den obigen Code zu kompilieren. Einer besagt, dass das letzte Platzhaltermuster nicht erreichbar ist. Die andere besagt, dass die erste Übereinstimmungserklärung unvollständig ist.
Diese beiden Warnungen scheinen miteinander in Konflikt zu stehen, und wenn ich in Klammern hinzufüge, um den Ausdruck klarer zu machen, verschwinden die Warnungen und mein Code funktioniert korrekt.
match setting with
| "-f" | "--file" -> // Open file
({ state with file = Some (cur_dir + "\\" + elem) }, "")
| "" -> // Option without parameter
(match elem with
| "-h" | "--help" -> // Display help message
({ state with help = true }, "")
| "-r" | "--readonly" -> // Open with readonly
({ state with readonly = true }, "")
| opt -> (state, opt))
| _ -> (state, "") // Ignore invalid option
Meine Frage ist das: Was war falsch mit dem ursprünglichen Code? Es war kein Fall einer falsch platzierten Klammer, und es scheint, dass es für den Compiler offensichtlich sein sollte, wo jedes Match endet.
Edit: hier ist die komplette Funktion, falls es hilft
let process_args argv =
let (result, _) = ((default_settings, "-f"), argv) ||>
Array.fold (fun (state, setting) elem ->
match setting with
| "-f" | "--file" -> // Open file
({ state with file = Some (cur_dir + "\\" + elem) }, "")
| "" -> // Option without parameter
match elem with
| "-h" | "--help" -> // Display help message
({ state with help = true }, "")
| "-r" | "--readonly" -> // Open with readonly
({ state with readonly = true }, "")
| opt -> (state, opt)
| _ -> (state, "") // Ignore invalid option
) in
result
Ich sollte auch beachten Sie, dass dieser Fehler mit Licht und ausführliche Syntax auftritt.
Edit2: Ich habe fälschlicherweise eine leicht veränderte Funktion eingefügt, was zu einigen Kompilierungsfehlern anstatt nur zu Warnungen führte. Entschuldigen Sie.
Ihr Beispiel funktioniert gut für mich. Es ist fast sicher ein Einrückungsfehler. – Ringil
Das Beispiel wurde direkt aus dem Quellcode kopiert und eingefügt. Außerdem tritt der Fehler unabhängig davon auf, ob ich '#light' off '' – idlys
verwende oder nicht. Wenn ich Ihre Spielanweisung in VS Code kopiere, zeigt das Ionide-Plugin keine Warnungen an. Aber wenn ich Ihre volle 'process_args'-Funktion kopiere, erhalte ich einen Einrückungsfehler in der' let'-Anweisung. Ich schreibe eine vollständige Antwort, aber die kurze Version (damit Sie nicht warten müssen) ist: Verschieben Sie Ihr '((default_settings, etc.') Tupel in die nächste Zeile und drücken Sie es vier Leerzeichen, und machen Sie keine anderen Änderungen, und Ihr Code sollte funktionieren – rmunn