O tipo Result permite que uma função devolva um único valor que indica tudo o seguinte:
O tipo Result é um tipo genérico que contém dois tipos subjacentes:
O tipo Result é também uma [união discriminada][discriminated-union] com os seguintes casos possíveis:
Ok <value> que representa um resultado bem-sucedidoError <reason> que representa uma falhaA seguinte função demonstra como criar um valor do tipo Result:
let validateName (name: string) : Result<string, string> =
match name with
| null -> Error "Name not found."
| "" -> Error "Name is empty."
| _ -> Ok name
Neste exemplo, o valor Ok é uma string (o nome fornecido) e o valor Error é também uma string (a causa do erro, em formato legível para humanos).
Result
Considera a seguinte definição de tipo e assinatura de função:
type FileOpenError =
| NotFound
| AccessDenied
| FileLocked
let openFile (filename: string) : Result<int, FileOpenError> =
O código que chama a função openFile pode usar correspondência de padrões para tratar os casos de sucesso e de falha, como no exemplo seguinte:
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."
A tua tarefa é criar um verificador de palavras-passe. Um verificador de palavras-passe valida a palavra-passe proposta por um utilizador para garantir que cumpre um conjunto de requisitos definidos pela organização que controla o acesso ao recurso em questão.
Para este exercício, os requisitos da palavra-passe são:
A tua solução tem de usar um Result para encapsular o estado de sucesso ou de falha.
No caso de sucesso, o Result deve conter a palavra-passe validada como uma string.
No caso de falha, o Result deve conter a regra que foi violada.
Para este exercício, o verificador de palavras-passe será simplista: vai indicar apenas quando uma única regra foi violada. Um exercício seguinte vai explorar um verificador de palavras-passe mais realista, capaz de indicar quando várias regras foram violadas ao mesmo tempo.
checkPassword
A função checkPassword verifica a palavra-passe fornecida em relação às regras acima mencionadas. Em caso de falha, indica a regra que foi violada, encapsulando um dos valores de PasswordRule dentro do valor do resultado.
checkPassword "abcdefghij5#"
// => Error MissingUppercaseLetter
A função getStatusMessage devolve uma string com uma mensagem legível por humanos que indica o significado do resultado devolvido por checkPassword.
getStatusMessage (Error MissingDigit)
// => "Error: does not have at least one digit"
Inscreve-te no Exercism para aprenderes e dominares F# com 18 conceitos148 exercícios, e mentoria humana real, tudo grátis.