EitherT:调用函数 returning Either 仅当某个条件为真时(否则 return 正确)

EitherT: Call function returning Either only if a certain condition is true (otherwise return right)

所以我有一个特定的函数,只有在特定条件为真时我才需要调用它。如果它是假的,我认为它是对的。

我会使用 EitherT.cond,但问题是我函数的 return 类型是 Future[Either[ErrorType, Unit] ],所以不适合我。这是我的代码,可以执行我想要的操作:

def callEitherFunction: Future[Either[ErrorType, Unit]]

for {
_ <- if (condition) {
     EitherT(callEitherFunction)
   } else {
     Either.right[ErrorType, Unit](()).toEitherT[Future]
   }
} yield {
  //Some actions
}

不知道有没有更优雅的方法。非常感谢任何帮助。

使用 EitherT 中的 rightT 怎么样?

for {
  _ <- if (condition) {
    EitherT(callEitherFunction)
  } else {
    EitherT.rightT[Future, ErrorType](())
  }
} yield {
  //Some actions
}

您可以按如下方式使用EitherT.cond

cond[Future](!condition, (), ()).leftFlatMap(_ => EitherT(callEitherFunction))

此外,[Future]在某些情况下可以省略,使其更短。

我不确定它是否比 if-else 更清楚:if-else 的稍长版本可能更容易理解和维护 [=25] =].


包含所有导入的完整示例:

import cats.data.EitherT
import scala.concurrent.Future
import scala.util.Either
import cats.syntax.either._
import cats.instances.future._
import scala.concurrent.ExecutionContext.Implicits.global

type ErrorType = String
def callEitherFunction: Future[Either[ErrorType, Unit]] = ???
def condition: Boolean = true

EitherT.cond(!condition, (), ()).leftFlatMap(_ => EitherT(callEitherFunction))