【问题标题】:Elegant way to change either to error with tagless final使用无标签最终更改为错误的优雅方式
【发布时间】:2020-03-05 18:18:45
【问题描述】:

我经常做这样的事情:

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

【问题讨论】:

    标签: scala functional-programming scala-cats cats-effect tagless-final


    【解决方案1】:

    使用来自猫 EitherliftTo 语法:maybeUser.liftTo[F]

    您也可以直接在F[Either[Error, User]] 上使用rethrow,来自猫MonadError 语法:

    def doSomething[F[_]: Sync]: F[User] = validate[F]("Name").rethrow
    

    请注意,您实际上并不需要 Sync - MonadError[*[_], Throwable] 就足够了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多