如何将 EitherT 转换为 Either?
How do you convert an EitherT to an Either?
我收到一个错误,因为在 for-comprehension 中我有 EitherTs 而不是 Eithers。我一直在寻找将 EitherT 和 EitherT 转换为 Either 的方法,但 Scala 搜索几乎找不到好的答案。
val res: Either[ClientError, Response] = stuff.proc match {
case Client1 => client1.doTheThing(sid) // returns Either[ClientError, Response]
case Client2 =>
for {
x <- getIt(a) // returns EitherT[Future, ClientError, Response]
y <- getTheOtherThing(b) // returns EitherT[Future, ClientError, Response]
} yield {
log.info(s"$x and $y")
makeItHappen(x, y) // returns Either[ClientError, Response]
}
}
Scala searches yield very few good answers.
这是一个强烈的暗示,应该重新考虑所采取的方法。
从技术上讲,您可以在 EitherT[Future, ClientError, Response]
上调用 value
返回 Future[Either[ClientError, Response]
,但现在您必须阻塞才能退出 Either[ClientError, Response]
,所以通常我们不会这样做那。更惯用的方法是继续在适当的 monadic 上下文中工作,但问题是你不能混合和匹配它们。相反,您可能必须使用 EitherT(Future.successful(anEither))
之类的东西将所有其他函数提升到“最高”单子上下文,以便所有单子对齐。
我收到一个错误,因为在 for-comprehension 中我有 EitherTs 而不是 Eithers。我一直在寻找将 EitherT 和 EitherT 转换为 Either 的方法,但 Scala 搜索几乎找不到好的答案。
val res: Either[ClientError, Response] = stuff.proc match {
case Client1 => client1.doTheThing(sid) // returns Either[ClientError, Response]
case Client2 =>
for {
x <- getIt(a) // returns EitherT[Future, ClientError, Response]
y <- getTheOtherThing(b) // returns EitherT[Future, ClientError, Response]
} yield {
log.info(s"$x and $y")
makeItHappen(x, y) // returns Either[ClientError, Response]
}
}
Scala searches yield very few good answers.
这是一个强烈的暗示,应该重新考虑所采取的方法。
从技术上讲,您可以在 EitherT[Future, ClientError, Response]
上调用 value
返回 Future[Either[ClientError, Response]
,但现在您必须阻塞才能退出 Either[ClientError, Response]
,所以通常我们不会这样做那。更惯用的方法是继续在适当的 monadic 上下文中工作,但问题是你不能混合和匹配它们。相反,您可能必须使用 EitherT(Future.successful(anEither))
之类的东西将所有其他函数提升到“最高”单子上下文,以便所有单子对齐。