[英]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.