gpt4 book ai didi

scala - 结合 `OptionT` 和 `EitherT` 来处理 `Future[Either[Error, Option[T]]]`

转载 作者:行者123 更新时间:2023-12-04 12:03:53 25 4
gpt4 key购买 nike

我想用猫 EitherTOptionT处理类型 Future[Either[Error, Option[T]] .假设有以下方法:

def findTeacher(id: Int): Future[Either[String, Option[Teacher]]]
def findSchool(teacher: Teacher): Future[Either[String, Option[School]]]

现在,如果我想随后在理解中调用它们,我可以使用 EitherTOptionT像这样:
def getSchoolByTeacherId(id: Int): Future[Either[String, Option[School]]] = {
val result = for {
maybeTeacher <- EitherT(findTeacher(id))
schoolF = maybeTeacher.map(findSchool).getOrElse(Future.successful(Right(None)))
school <- EitherT(schoolF)
} yield {
school
}

result.value
}

我想知道是否可以通过组合 OptionT 来使其更简洁与 EitherT ?

最佳答案

如果正确理解你的问题,你想构建一个 EitherT 的组合 monad-transformer和 OptionT .使用 Cats 你可以尝试这样的事情:

type FutureEither[X] = EitherT[Future, String, X]
type OResult[X] = OptionT[FutureEither, X]

object OResult {

implicit def apply[A](value: Future[Either[String, Option[A]]]): OResult[A] = OptionT[FutureEither, A](EitherT(value))

implicit class OResultOps[A](val value: OResult[A]) extends AnyVal {
@inline
def directValue: Future[Either[String, Option[A]]] = value.value.value
}

}

然后你可以重写你的 getSchoolByTeacherId作为
import OResult._
def getSchoolByTeacherId(id: Int): Future[Either[String, Option[School]]] = {
val result = for {
teacher <- OResult(findTeacher(id))
school <- findSchool(teacher)
} yield school

result.directValue
}

不幸的是,即使 OResult.applyimplicit您仍然必须在 for-comprehension 的第一行中明确写出它,但这允许在其他行中跳过它。

关于scala - 结合 `OptionT` 和 `EitherT` 来处理 `Future[Either[Error, Option[T]]]`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48010824/

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