Stu*_*man 6 functional-programming scala scala-cats tagless-final cats-effect
我经常做这样的事情:
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
Run Code Online (Sandbox Code Playgroud)
简而言之,这意味着 if Eitheris leftthen use raiseError,如果它right只是返回值。
有没有更方便的“拆包” 方法Either?
使用liftTo来自 cats 的Either语法:maybeUser.liftTo[F]。
您还可以直接在rethrowcats 语法中使用 , :MonadErrorF[Either[Error, User]]
def doSomething[F[_]: Sync]: F[User] = validate[F]("Name").rethrow
Run Code Online (Sandbox Code Playgroud)
请注意,您实际上并不需要Sync-MonadError[*[_], Throwable]就足够了。