Le type Result permet à une fonction de renvoyer une seule valeur qui indique tous les éléments suivants :
Le type Result est un type générique qui contient deux types sous-jacents :
Le type Result est aussi une [union discriminée][discriminated-union] avec les cas possibles suivants :
Ok <value> qui représente un résultat réussiError <reason> qui représente un échecLa fonction suivante montre comment créer une valeur de type Result :
let validateName (name: string) : Result<string, string> =
match name with
| null -> Error "Name not found."
| "" -> Error "Name is empty."
| _ -> Ok name
Dans cet exemple, la valeur Ok est une string (le nom donné), et la valeur Error est aussi une string (la cause de l'erreur, sous une forme lisible par un humain).
Result
Prenons la définition de type et la signature de fonction suivantes :
type FileOpenError =
| NotFound
| AccessDenied
| FileLocked
let openFile (filename: string) : Result<int, FileOpenError> =
Le code qui appelle la fonction openFile peut recourir au filtrage par motif pour gérer les cas de réussite et d'échec, comme dans l'exemple suivant :
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."
Ta tâche est de créer un vérificateur de mot de passe. Un vérificateur de mot de passe valide le mot de passe proposé par un utilisateur pour s'assurer qu'il répond à un ensemble d'exigences définies par l'organisation qui contrôle l'accès à la ressource en question.
Pour cet exercice, les exigences du mot de passe sont :
Ta solution doit utiliser un Result pour encapsuler le statut de succès ou d'échec.
Dans le cas de succès, le Result doit transmettre le mot de passe validé sous forme de string.
Dans le cas d'échec, le Result doit transmettre la règle qui a été violée.
Pour cet exercice, le vérificateur de mot de passe sera simpliste : il indiquera uniquement quand une seule règle a été violée. Un exercice ultérieur explorera un vérificateur de mot de passe plus réaliste, qui peut indiquer quand plusieurs règles ont été violées en même temps.
checkPassword
La fonction checkPassword vérifie le mot de passe donné par rapport aux règles mentionnées ci-dessus. En cas d'échec, elle indique la règle qui a été violée en encapsulant l'une des valeurs de PasswordRule dans la valeur de résultat.
checkPassword "abcdefghij5#"
// => Error MissingUppercaseLetter
La fonction getStatusMessage renvoie une string contenant un message lisible par un humain indiquant la signification du résultat renvoyé par checkPassword.
getStatusMessage (Error MissingDigit)
// => "Error: does not have at least one digit"
Inscris-toi sur Exercism pour apprendre et maîtriser F# avec 18 concepts148 exercices, et un vrai mentorat humain, le tout gratuitement.