Тип Result дає функції змогу повернути єдине значення, яке вказує на все перелічене нижче:
Тип Result - узагальнений тип, який містить два внутрішні типи:
Тип Result - також [дискриміноване обʼєднання][discriminated-union] із такими можливими випадками:
Ok <value> позначає успішний результатError <reason> позначає невдачуНаступна функція демонструє, як створити значення типу Result:
let validateName (name: string) : Result<string, string> =
match name with
| null -> Error "Name not found."
| "" -> Error "Name is empty."
| _ -> Ok name
У цьому прикладі значення Ok - це рядок тексту (англ. string), а саме передане імʼя, а значення Error теж є рядком тексту (причина помилки, у зрозумілій людині формі).
Result
Розгляньмо таке визначення типу та сигнатуру функції:
type FileOpenError =
| NotFound
| AccessDenied
| FileLocked
let openFile (filename: string) : Result<int, FileOpenError> =
Код, який викликає функцію openFile, може використати зіставлення зі зразком, щоб опрацювати випадки успіху й невдачі, як у наступному прикладі:
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."
Ваше завдання - створити перевіряльник паролів. Перевіряльник паролів перевіряє запропонований користувачем пароль, щоб переконатися, що він відповідає набору вимог, визначених організацією, яка контролює доступ до відповідного ресурсу.
У цій вправі вимоги до пароля такі:
!@#$%^&*
Використайте Result у своєму рішенні, щоб інкапсулювати статус успіху або невдачі.
У разі успіху Result має містити перевірений пароль як рядок тексту (англ. string).
У разі невдачі Result має містити правило, яке було порушено.
У цій вправі перевіряльник паролів буде спрощеним: він повідомлятиме лише про одне порушене правило. У наступній вправі ми розглянемо реалістичніший перевіряльник паролів, який може повідомляти про кілька порушених правил одночасно.
checkPassword
Функція checkPassword перевіряє заданий пароль на відповідність згаданим правилам. У разі невдачі вона вказує правило, яке було порушено, інкапсулюючи одне зі значень PasswordRule у значенні результату.
checkPassword "abcdefghij5#"
// => Error MissingUppercaseLetter
Функція getStatusMessage повертає рядок тексту зі зрозумілим для людини повідомленням, яке пояснює значення результату, поверненого з checkPassword.
getStatusMessage (Error MissingDigit)
// => "Error: does not have at least one digit"
Зареєструйтеся на Exercism, щоб вивчати й опановувати F#, а також 18 концепцій148 вправ та справжнє наставництво від людей, і все це безкоштовно.