如何将 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)) 之类的东西将所有其他函数提升到“最高”单子上下文,以便所有单子对齐。