Элегантный способ изменить либо на ошибку с окончанием без тегов
Я часто делаю такие вещи, как:
import cats.effect.Sync
import cats.implicits._
case class User(name: String)
case object Error extends Exception
def validate[F[_]: Sync](name: String): F[Either[Error, User]] = Sync[F].pure(User(name).asRight)
def doSomething[F[_]: Sync]: F[User] = for {
maybeUser <- validate("Name")
user <- maybeUser.fold(Sync[F].raiseError[User](_), Sync[F].pure(_))
} yield user
В двух словах это означает, что если Either
является left
затем используйте raiseError
, если это right
просто вернуть значение.
Есть ли более удобный способ "развернуть" Either
?
1 ответ
Решение
Использовать liftTo
от кошек Either
синтаксис: maybeUser.liftTo[F]
.
Вы также можете использовать rethrow
, от кошек MonadError
синтаксис, прямо на F[Either[Error, User]]
:
def doSomething[F[_]: Sync]: F[User] = validate[F]("Name").rethrow
Обратите внимание, что на самом деле вам не нужно Sync
- MonadError[*[_], Throwable]
достаточно.