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 es también 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 proporcionado), y el valor Error es también 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 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 asegurarse de que cumple una serie 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.
En el caso de éxito, el Result debe contener la contraseña validada como string.
En el caso de fallo, el Result debe contener la regla que se ha incumplido.
Para este ejercicio, el verificador de contraseñas será muy simple: solo indicará cuándo se ha incumplido una única regla. En un ejercicio posterior veremos un verificador de contraseñas más realista, capaz de indicar cuándo se han incumplido varias reglas a la vez.
checkPassword
La función checkPassword comprueba la contraseña dada con los requisitos mencionados. Si falla, indica la regla que se ha incumplido 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 las personas e 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.