O tipo Result permite que uma função retorne um único valor que indica todas as coisas a seguir:
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> representando um resultado bem-sucedidoError <reason> representando uma falhaA função a seguir demonstra como criar um valor 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 por humanos).
Result
Considere 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 a correspondência de padrões para tratar os casos de sucesso e falha, como no exemplo a seguir:
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."
Sua tarefa é criar um verificador de senha. Um verificador de senha valida a senha proposta por um usuário. Ele garante que ela atenda a um conjunto de requisitos definidos pela organização que controla o acesso ao recurso em questão.
Para este exercício, os requisitos da senha são:
Sua solução deve usar um Result para encapsular o status de sucesso ou de falha.
No caso de sucesso, o Result deve transmitir a senha validada como string.
No caso de falha, o Result deve transmitir a regra que foi violada.
Para este exercício, o verificador de senha será simplista: ele vai indicar apenas quando uma única regra foi violada. Um exercício posterior vai explorar um verificador de senha mais realista, capaz de indicar quando várias regras foram violadas ao mesmo tempo.
checkPassword
A função checkPassword verifica a senha fornecida de acordo com as regras mencionadas acima. Em caso de falha, ela indica a regra que foi violada, encapsulando um dos valores de PasswordRule dentro do valor de resultado.
checkPassword "abcdefghij5#"
// => Error MissingUppercaseLetter
A função getStatusMessage retorna uma string contendo uma mensagem legível por humanos que indica o significado do resultado retornado por checkPassword.
getStatusMessage (Error MissingDigit)
// => "Error: does not have at least one digit"
Crie sua conta no Exercism para aprender e dominar F# com 18 conceitos148 exercícios e mentoria humana de verdade, tudo de graça.