Either
Either는 주로 두 가지 케이스 중 하나의 타입을 갖도록 하는 표현 방식이다.
Either는 enum으로 구현할 수 있으며, 대표적으로 자주 사용하는 Result 타입이 있다.
예를 들어, 성공적인 결과와 실패한 결과를 구분하여 반환하는 Result 타입이 있다.
Result는 반환될 때 결과가 성공이어서 특정 타입으로 반환되는 경우뿐만 아니라, 실패하여 특정 에러를 반환해야 하는 경우가 있기 때문에 특정 타입 또는 에러로 반환하기 위해 Either라는 개념을 활용한다.
Either의 정의
enum Either<L, R> {
case left(L)
case right(R)
}
만약 위의 코드를 enum이 아닌 struct로 구현하게 된다면 'L 이면서 R' 또는 'L과 R이 둘 다 아님'과 같은 원치 않는 케이스가 발생할 수 있다.
Struct로 구현한 예시
struct EitherByStruct<L, R> {
var left: L?
var right: R?
}
이렇게 구현하면 left와 right가 둘 다 nil일 수 있는 경우, 또는 둘 다 값이 있을 수 있는 경우가 발생할 수 있어 Either의 본래 목적을 달성할 수 없다.
Result 타입의 예시
Result 타입을 유사하게 구현한다면 아래와 같이 구현할 수 있다.
enum Result<T> {
case success(T)
case failure(Error)
}
이처럼 Result 타입은 성공적인 결과를 담는 success 케이스와 오류를 담는 failure 케이스로 구성된다. 이를 통해 함수의 결과가 성공인지 실패인지, 그리고 실패이면 어떤 에러가 발생했는지 명확히 전달할 수 있다.
Maybe
Maybe는 부재 가능성에 대한 표현 방식이다. 구현은 enum으로 되어 있으며, Either와 다를 것이 없지만 존재하지 않음을 의미하는 none의 케이스가 존재한다. Optional이 곧 Maybe의 구현이라고 볼 수 있다.
Maybe의 정의
enum Maybe<A> {
case none
case some(A)
}
Maybe는 값이 존재하지 않을 수 있는 상황을 명확하게 표현할 수 있다.