优雅的方式来更改无标签最终错误

我经常做类似的事情:

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

简而言之,这意味着如果Eitherleft,则使用raiseError,如果它是right则只是返回值。

是否有更方便的方式来“解包” Either

lisa7262 回答:优雅的方式来更改无标签最终错误

使用liftTo猫中的Either语法:maybeUser.liftTo[F]

您也可以直接在rethrow上使用MonadError(从cats F[Either[Error,User]]语法开始)

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

请注意,您实际上不需要Sync-MonadError[*[_],Throwable]就足够了。

本文链接:https://www.f2er.com/3133378.html

大家都在问