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 값은 문자열(주어진 이름)이고, 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는 검증된 비밀번호를 문자열로 담아야 해요.
실패한 경우, 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개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.