gpt4 book ai didi

scala - future 的 Monad 转换器[Either[Error, Option[User]]]

转载 作者:行者123 更新时间:2023-12-04 20:29:10 26 4
gpt4 key购买 nike

考虑 retrieveUser 的签名其中检索不存在的用户不会被建模为错误,也就是说,它被建模为 Future[Right[None]] :

def retrieveUser(email: String): Future[Either[Error, Option[User]]]

是否存在 monad 转换器 MT这样我们就可以写
(for {
user <- MT(retrieveUser(oldEmail))
_ <- MT(updateUser(user.setEmail(newEmail)))
} {}).run

使用 EitherT我能做的最好的是:
EitherT(retrieveUser(oldEmail)).flatMap {
case Some(user) =>
EitherT(updateUser(user.setEmail(newEmail)))

case None =>
EitherT.right(Future.successful({}))
}.run

问题是映射超过 EitherT(retrieveUser(email))结果 Option[User] , 而不是未装箱 User ,这打破了理解。

最佳答案

我假设参数的顺序与 EitherT form Scala Cats 中的相同: 一个 EitherT[F[_], A, B]本质上只是 F[Either[A, B]] 的包装器.

同样, OptionT[F, A] 是包装 F[Option[A]] .

因此,

OptionT[EitherT[Future, Error, ?], A]

是一个包装
EitherT[Future, Error, Option[A]]

这反过来又是一个包装
Future[Either[Error, Option[A]]]

所以,
OptionT[EitherT[Future, Error, ?], User](
EitherT[Future, Error, Option[User]](retrieveUser(oldEmail))
)

应该类型检查(使用 the non/kind-projector ),并使用 -Ypartial-unification还应该自动推断类型,因此您可以尝试使用
OptionT(EitherT(retrieveUser(oldEmail))

在for-consultations里面。

关于scala - future 的 Monad 转换器[Either[Error, Option[User]]],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50189883/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com