用无标签的最终样式更改为错误的优雅方法

问题描述 投票:1回答:1

我经常做类似的事情:

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个回答
2
投票

使用猫liftTo语法中的EithermaybeUser.liftTo[F]

您还可以直接在rethrow上使用cats MonadError语法中的F[Either[Error, User]]

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

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

© www.soinside.com 2019 - 2024. All rights reserved.