Either

실패인 Left(L)이거나 성공인 Right(R)인 값 — 타입 있는 에러 시스템의 경계 타입입니다.

sealed class Either<L, R> — Left(L value) | Right(R value) const factory Either.left(L value) | Either.right(R value) — dot-shorthand targets (Dart ≥ 3.10) T fold<T>(T Function(L left) ifLeft, T Function(R right) ifRight) static Either<Object, R> Either.catching<R>(R Function() block)

강의

Either<L, R>은 실패를 함수 시그니처의 일부로 만듭니다. 던지거나(타입 시스템에는 보이지 않습니다) null을 반환하는( 실패했는지는 아무것도 말해 주지 않습니다) 대신 Left(error)Right(value)를 반환하는 것입니다. 이 클래스는 sealed이므로 그 위의 switch는 빠짐없이 다뤄야 하고 — 실패 케이스를 처리하라고 컴파일러가 일깨워 줍니다.

메서드 집합은 Arrow 2.x가 엄선한 것과 같습니다. fold는 양쪽을 하나의 값으로 접고, map/mapLeft는 한쪽만 변환하고, flatMap은 앞 결과에 의존하는 실패 가능한 단계를 이어 붙이고, getOrNull/getOrElse는 평범한 Dart로 돌아가는 다리입니다. Either경계에서 살아야 하는 타입입니다. 계산 안쪽에서는 either 빌더를 쓰세요. 거기서는 각 단계가 flatMap 피라미드가 아니라 일직선 r.bind 한 줄입니다.

데모 1 · Left, Right, 그리고 빠짐없는 switch

데모 2 · fold, map, mapLeft, flatMap

데모 3 · 점 축약 표기(Dart ≥ 3.10)

Eitherconst 팩토리 Either.left / Either.right를 갖고 있어서 Dart 3.10의 점 축약 표기(dot shorthands)가 이 타입으로 해석됩니다. 문맥 타입이 이미 Either인 곳이라면 — 반환 위치, switch 식의 한 갈래, ==의 오른쪽 — 타입 이름을 생략하고 .left(error) / .right(value)라고 쓸 수 있습니다. Left(…) / Right(…)와 완전히 같은 객체이고, 다만 문맥에서 추론될 뿐입니다.

직접 해 보기

예외와 타입 있는 에러는 엄격히 분리된 채로 남습니다. throw된 예외는 타입 있는 에러 코드를 그대로 뚫고 전파됩니다. throw를 Either로 잡으려면 Either.catching(실패 타입은 Object)이나 Either.catchingWith(throw를 먼저 자신의 실패 타입으로 변환)로 명시하세요. 연습: 실패하는 파싱이 크래시 대신 Left(bad input)을 출력하도록 만들어 보세요.

관련 항목: either 빌더 — 일직선 코드로 Either 만들기 · 에러 누적 — 첫 실패만이 아니라 모든 실패를 모으기 · Either × 파이프라인 — 체인 위의 rights, lefts, sequence · 타입 있는 에러 — 전체 가이드