Der Typ Result ermöglicht es einer Funktion, einen einzelnen Wert zurückzugeben, der alle folgenden Punkte angibt:
Der Typ Result ist ein generischer Typ, der zwei zugrunde liegende Typen enthält:
Der Typ Result ist außerdem eine [diskriminierte Union][discriminated-union] mit den folgenden möglichen Fällen:
Ok <value> steht für ein erfolgreiches ErgebnisError <reason> steht für einen FehlerDie folgende Funktion zeigt, wie du einen Result-Wert erstellst:
let validateName (name: string) : Result<string, string> =
match name with
| null -> Error "Name not found."
| "" -> Error "Name is empty."
| _ -> Ok name
In diesem Beispiel ist der Ok-Wert ein String (der angegebene Name), und der Error-Wert ist ebenfalls ein String (die Ursache des Fehlers, in für Menschen lesbarer Form).
Result-Werts lesenBetrachte die folgende Typdefinition und Funktionssignatur:
type FileOpenError =
| NotFound
| AccessDenied
| FileLocked
let openFile (filename: string) : Result<int, FileOpenError> =
Code, der die Funktion openFile aufruft, kann Musterabgleich verwenden, um die Erfolgs- und Fehlerfälle zu behandeln, wie im folgenden Beispiel:
match openFile(filename) with
| Ok handle -> doSomethingWithFile(handle)
| Error NotFound -> printfn $"Error: file {filename} was not found."
| Error AccessDenied -> printfn $"Error: you do not have permission to open the file {filename}."
| Error FileLocked -> printfn $"Error: file {filename} is already in use."
Deine Aufgabe ist es, einen Passwort-Checker zu erstellen. Ein Passwort-Checker überprüft das vorgeschlagene Passwort eines Benutzers. Er stellt sicher, dass es die Anforderungen erfüllt. Diese werden von der Organisation festgelegt, die den Zugriff auf die jeweilige Ressource kontrolliert.
Für diese Übung sind die Passwortanforderungen:
Deine Lösung muss ein Result verwenden, um den Erfolgs- oder Fehlerstatus zu kapseln.
Im Erfolgsfall muss das Result das validierte Passwort als String enthalten.
Im Fehlerfall muss das Result die Regel enthalten, die verletzt wurde.
Für diese Übung ist der Passwort-Checker einfach gehalten: Er zeigt nur an, wenn eine einzelne Regel verletzt wurde. Eine spätere Übung behandelt einen realistischeren Passwort-Checker, der anzeigen kann, wenn mehrere Regeln gleichzeitig verletzt wurden.
checkPassword
Die Funktion checkPassword prüft das angegebene Passwort gegen die oben genannten Regeln. Bei einem Fehler gibt sie die verletzte Regel an, indem sie einen der Werte von PasswordRule in den Ergebniswert einbettet.
checkPassword "abcdefghij5#"
// => Error MissingUppercaseLetter
Die Funktion getStatusMessage gibt einen String zurück. Dieser enthält eine menschenlesbare Nachricht, die die Bedeutung des von checkPassword zurückgegebenen Ergebnisses angibt.
getStatusMessage (Error MissingDigit)
// => "Error: does not have at least one digit"
Melde dich bei Exercism an, um F# mit 18 Konzepte148 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.