Элегантный способ изменить либо на ошибку с финалом без тегов - PullRequest
1 голос
/ 09 ноября 2019

Я часто делаю такие вещи, как:

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 Ответ

2 голосов
/ 09 ноября 2019

Используйте liftTo из синтаксиса кошек Either: maybeUser.liftTo[F].

Вы также можете использовать rethrow, из синтаксиса кошек MonadError, непосредственно в F[Either[Error, User]]:

def doSomething[F[_]: Sync]: F[User] = validate[F]("Name").rethrow

Обратите внимание, что вам на самом деле не нужно * достаточно 1012 * - MonadError[*[_], Throwable].

...