繁体   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