[英]Elegant way to change either to error with tagless final
我经常做这样的事情:
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
?
使用来自猫的liftTo
Either
语法: maybeUser.liftTo[F]
。
您还可以直接在F[Either[Error, User]]
上使用来自猫rethrow
语法的MonadError
:
def doSomething[F[_]: Sync]: F[User] = validate[F]("Name").rethrow
请注意,您实际上并不需要Sync
- MonadError[*[_], Throwable]
就足够了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.