Either 조합자

합치기, 대체하기, 검증하기 — map2map5, alt, orElse, filterOrElse.

Either<L, T> Either.map2<B, T>(Either<L, B> b, T Function(R a, B b) combine) // …through map5 Either<L, R> Either.alt(Either<L, R> Function() other) Either<L2, R> Either.orElse<L2>(Either<L2, R> Function(L left) other) Either<L, R> Either.filterOrElse(bool Function(R value) predicate, L Function(R value) onFalse)

강의

Either 자체가 주는 것은 map, flatMap, fold입니다. 여기 네 메서드는 자꾸만 flatMap 안에 if를 넣는 모양으로 흘러가던 자리들을 덮습니다.

map2map5 — 독립적인 결과 합치기

여러 Either가 함께 성공해야 할 때 — 이름 그리고 나이 그리고 이메일을 파싱할 때 — map2가 그것들을 합치고 가장 왼쪽 실패를 남깁니다. 합치는 콜백은 모든 갈래가 Right일 때만 실행됩니다. 항수는 5까지로, zipOrAccumulate2..5, Curry2..Curry5와 같은 상한입니다.

여기서 "빠른 실패"는 작업이 아니라 보고에 대한 이야기입니다. 각 갈래는 이미 계산해 둔 값이므로 전부 실행되었고, 첫 실패에서 멈추는 것은 돌려받는 답 쪽입니다. 실패를 모두 알고 싶을 때 — 잘못된 필드 네 개를 한 번에 표시하는 폼이라면 — 그것은 누적이고, EitherNel을 돌려주며 accumulate 스코프가 필요합니다. 메시지 하나가 옳은 답일 때 map2를 집으세요.

altorElse — 대체하기

alt는 대체 사다리입니다. 이걸 해 보고, 실패하면 저걸 해 봅니다. 대안이 콜백이라서 첫 성공 이후로는 아무것도 건드리지 않습니다 — 캐시, 그다음 디스크, 그다음 네트워크 순으로, 실제로 닿은 만큼만 값을 치릅니다. 실패 값은 버려집니다.

orElse는 그 실패가 중요할 때의 같은 동작입니다. 핸들러가 실패 값을 받고 다른 실패 타입을 돌려줄 수도 있어서, 한 오류 어휘를 다른 어휘로 옮기는 통로이기도 합니다.

recover는 더 풍부한 형제입니다. 핸들러를 새 raise 스코프 안에서 돌리므로, 핸들러는 Either를 손으로 짓는 대신 평범한 Dart 코드를 쓰고 r.raise를 부릅니다. 교체할 Either가 이미 있으면 alt/orElse를, 핸들러가 실제로 할 일이 있으면 recover를 쓰세요.

filterOrElse — 그 자리에서 검증하기

술어에서 떨어진 RightLeft로 강등시킵니다. 두 번째 콜백이 그 값으로부터 그것을 지어내므로, 메시지가 무엇이 잘못됐는지 짚을 수 있습니다. Left는 손대지 않고 통과하며 술어는 아예 실행되지 않습니다. 이어 붙이면 처음 실패한 검사가 이깁니다.

Either 값 쪽으로 옮겨 놓은 Raise.ensure입니다. 그쪽은 either { } 빌더 안에서 같은 일을 합니다. 빌더 안이라면 ensure를, 이미 손에 든 값에 대해서라면 이쪽을 쓰세요.

데모 1 · map2와 map3

데모 2 · alt, orElse, filterOrElse

직접 해 보기

연습: 0..149를 벗어난 나이를 직접 정한 메시지로 거절해 보세요.

관련 항목: Either — 이들이 확장하는 타입 · either & Raise — 빌더 스코프, ensurerecover · 누적 — 첫 실패가 아니라 모든 실패 · Either × 파이프라인 — 체인을 통해 Either 나르기