El tipo Result permite que una función devuelva un único valor que indique todas las siguientes cosas:
El tipo Result es un tipo genérico que contiene dos tipos subyacentes:
El tipo Result también es una [unión discriminada][discriminated-union] con los siguientes casos posibles:
Ok <value> que representa un resultado exitosoError <reason> que representa un falloLa siguiente función demuestra cómo crear un valor Result:
let validateName (name: string) : Result<string, string> =
match name with
| null -> Error "Name not found."
| "" -> Error "Name is empty."
| _ -> Ok name
En este ejemplo, el valor Ok es un string (el nombre dado), y el valor Error también es un string (la causa del error, en formato legible para humanos).
Result
Considera la siguiente definición de tipo y firma de función:
type FileOpenError =
| NotFound
| AccessDenied
| FileLocked
let openFile (filename: string) : Result<int, FileOpenError> =
El código que llama a la función openFile puede usar la coincidencia de patrones para manejar los casos de éxito y de fallo, como en el siguiente ejemplo:
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."
Tu tarea es crear un verificador de contraseñas. Un verificador de contraseñas valida la contraseña propuesta por un usuario para garantizar que cumple con un conjunto de requisitos definidos por la organización que controla el acceso al recurso en cuestión.
Para este ejercicio, los requisitos de la contraseña son:
Tu solución debe usar un Result para encapsular el estado de éxito o de fallo.
Para el caso de éxito, el Result debe comunicar la contraseña validada como un string.
Para el caso de fallo, el Result debe comunicar la regla que se violó en ese caso.
Para este ejercicio, el verificador de contraseñas será simplista: solo indicará cuándo se ha violado una única regla. Un ejercicio posterior explorará un verificador de contraseñas más realista que pueda indicar cuándo se han violado varias reglas a la vez.
checkPassword
La función checkPassword verifica la contraseña dada contra las reglas mencionadas. En caso de fallo, indica la regla que se violó encapsulando uno de los valores de PasswordRule dentro del valor del resultado.
checkPassword "abcdefghij5#"
// => Error MissingUppercaseLetter
La función getStatusMessage devuelve un string que contiene un mensaje legible para humanos que indica el significado del resultado devuelto por checkPassword.
getStatusMessage (Error MissingDigit)
// => "Error: does not have at least one digit"
Regístrate en Exercism para aprender y dominar F# con 18 conceptos148 ejercicios y mentoría humana real, todo gratis.