Either 조합자
합치기, 대체하기, 검증하기 — map2…map5, alt, orElse, filterOrElse.
강의
Either 자체가 주는 것은
map, flatMap, fold입니다. 여기
네 메서드는 자꾸만 flatMap 안에 if를 넣는
모양으로 흘러가던 자리들을 덮습니다.
map2 … map5 — 독립적인 결과 합치기
여러 Either가 함께 성공해야 할 때 — 이름 그리고
나이 그리고 이메일을 파싱할 때 — map2가 그것들을
합치고 가장 왼쪽 실패를 남깁니다. 합치는 콜백은 모든
갈래가 Right일 때만 실행됩니다. 항수는 5까지로,
zipOrAccumulate2..5,
Curry2..Curry5와 같은 상한입니다.
여기서 "빠른 실패"는 작업이 아니라 보고에 대한 이야기입니다.
각 갈래는 이미 계산해 둔 값이므로 전부 실행되었고, 첫 실패에서 멈추는
것은 돌려받는 답 쪽입니다. 실패를 모두 알고 싶을 때 — 잘못된 필드 네
개를 한 번에 표시하는 폼이라면 — 그것은
누적이고, EitherNel을 돌려주며
accumulate 스코프가 필요합니다. 메시지 하나가 옳은 답일 때
map2를 집으세요.
alt와 orElse — 대체하기
alt는 대체 사다리입니다. 이걸 해 보고, 실패하면 저걸 해
봅니다. 대안이 콜백이라서 첫 성공 이후로는 아무것도 건드리지
않습니다 — 캐시, 그다음 디스크, 그다음 네트워크 순으로, 실제로 닿은
만큼만 값을 치릅니다. 실패 값은 버려집니다.
orElse는 그 실패가 중요할 때의 같은 동작입니다. 핸들러가
실패 값을 받고 다른 실패 타입을 돌려줄 수도 있어서, 한 오류 어휘를 다른
어휘로 옮기는 통로이기도 합니다.
recover는 더 풍부한 형제입니다.
핸들러를 새 raise 스코프 안에서 돌리므로, 핸들러는 Either를
손으로 짓는 대신 평범한 Dart 코드를 쓰고 r.raise를 부릅니다.
교체할 Either가 이미 있으면
alt/orElse를, 핸들러가 실제로 할 일이 있으면
recover를 쓰세요.
filterOrElse — 그 자리에서 검증하기
술어에서 떨어진 Right를 Left로 강등시킵니다.
두 번째 콜백이 그 값으로부터 그것을 지어내므로, 메시지가 무엇이
잘못됐는지 짚을 수 있습니다. Left는 손대지 않고 통과하며
술어는 아예 실행되지 않습니다. 이어 붙이면 처음 실패한 검사가 이깁니다.
Either 값 쪽으로 옮겨 놓은
Raise.ensure입니다. 그쪽은
either { } 빌더 안에서 같은 일을 합니다. 빌더 안이라면
ensure를, 이미 손에 든 값에 대해서라면 이쪽을 쓰세요.
데모 1 · map2와 map3
데모 2 · alt, orElse, filterOrElse
직접 해 보기
연습: 0..149를 벗어난 나이를 직접 정한 메시지로 거절해 보세요.
Either — 이들이 확장하는 타입 ·
either & Raise — 빌더 스코프, ensure와 recover ·
누적 — 첫 실패가 아니라 모든 실패 ·
Either × 파이프라인 — 체인을 통해 Either 나르기