簡體   English   中英

使用無標簽最終更改為錯誤的優雅方式

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

簡而言之,這意味着如果Eitherleft則使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM