Il tipo Result permette a una funzione di restituire un unico valore che indica tutte le cose seguenti:
Il tipo Result è un tipo generico che contiene due tipi sottostanti:
Il tipo Result è anche una [unione discriminata][discriminated-union] con i seguenti casi possibili:
Ok <value> che rappresenta un risultato riuscitoError <reason> che rappresenta un fallimentoLa seguente funzione mostra come creare un valore Result:
let validateName (name: string) : Result<string, string> =
match name with
| null -> Error "Name not found."
| "" -> Error "Name is empty."
| _ -> Ok name
In questo esempio, il valore Ok è una stringa (il nome fornito) e anche il valore Error è una stringa (la causa dell'errore, in una forma leggibile).
Result
Considera la seguente definizione di tipo e la firma della funzione:
type FileOpenError =
| NotFound
| AccessDenied
| FileLocked
let openFile (filename: string) : Result<int, FileOpenError> =
Il codice che chiama la funzione openFile può usare il pattern matching per gestire i casi di successo e di fallimento, come nell'esempio seguente:
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."
Il tuo compito è creare un verificatore di password. Un verificatore di password convalida la password proposta da un utente per assicurarsi che soddisfi una serie di requisiti definiti dall'organizzazione che controlla l'accesso alla risorsa in questione.
Per questo esercizio, i requisiti della password sono:
La soluzione deve usare un Result per incapsulare lo stato di successo o di fallimento.
Nel caso di successo, il Result deve riportare la password convalidata sotto forma di stringa.
Nel caso di fallimento, il Result deve riportare la regola che è stata violata.
Per questo esercizio, il verificatore di password sarà molto semplice: indicherà solo quando è stata violata una singola regola. Un esercizio successivo esplorerà un verificatore di password più realistico, in grado di indicare quando più regole sono state violate contemporaneamente.
checkPassword
La funzione checkPassword verifica la password data rispetto ai requisiti menzionati sopra. In caso di fallimento, indica la regola violata incapsulando uno dei valori di PasswordRule all'interno del valore risultante.
checkPassword "abcdefghij5#"
// => Error MissingUppercaseLetter
La funzione getStatusMessage restituisce una stringa contenente un messaggio leggibile da una persona che indica il significato del risultato restituito da checkPassword.
getStatusMessage (Error MissingDigit)
// => "Error: does not have at least one digit"
Iscriviti a Exercism per imparare e padroneggiare F# con 18 concetti148 esercizi e il mentoring di persone reali, tutto gratis.