Either

Un valor que es o bien un fallo Left(L) o bien un acierto Right(R) — el tipo frontera del sistema de errores tipados.

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)

Lección

Either<L, R> convierte el fallo en parte de la firma de una función: en lugar de lanzar una excepción (invisible para el sistema de tipos) o devolver null (que no dice nada sobre el porqué), devuelves Left(error) o Right(value). La clase es sealed, así que un switch sobre ella es exhaustivo — el compilador te recuerda que trates el caso de fallo.

El conjunto de métodos es el que Arrow 2.x ha depurado: fold colapsa ambos lados en un único valor, map/mapLeft transforman uno de los dos lados, flatMap encadena un paso falible dependiente, y getOrNull/getOrElse hacen de puente de vuelta al Dart de siempre. Either está pensado para vivir en la frontera: dentro de un cómputo, es preferible el constructor either, donde cada paso es un r.bind en línea recta en vez de una pirámide de flatMap.

Demo 1 · Left, Right y switch exhaustivo

Demo 2 · fold, map, mapLeft, flatMap

Demo 3 · dot shorthands (Dart ≥ 3.10)

Either incluye las factorías const Either.left / Either.right para que los dot shorthands de Dart 3.10 se resuelvan contra ella: allí donde el tipo del contexto ya es Either — una posición de retorno, una rama de una expresión switch, el lado derecho de == — puedes omitir el nombre del tipo y escribir .left(error) / .right(value). Son los mismos objetos que Left(…) / Right(…), solo que inferidos a partir del contexto.

Pruébalo tú

Las excepciones y los errores tipados se mantienen estrictamente separados: una excepción lanzada atraviesa el código de errores tipados sin que nada la toque. Para capturar un throw dentro de un Either, sé explícito con Either.catching (tipo de fallo Object) o Either.catchingWith (que primero convierte la excepción a tu propio tipo de fallo). Ejercicio: haz que el parseo fallido imprima Left(bad input) en vez de reventar.

Relacionado: constructor either — construye Eithers con código en línea recta · acumulación — recoge todos los fallos, no solo el primero · Either × pipelinesrights, lefts, sequence sobre cadenas · errores tipados — guía completa