EitherT:仅当满足特定条件时,调用函数才返回Either(否则返回右)

时间:2019-07-15 14:19:35

标签: scala conditional-statements monad-transformers scala-cats either

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

我会使用 EitherT.cond ,但问题是我函数的返回类型是 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
}

我想知道是否还有一种更优雅的方法。不胜感激。

2 个答案:

答案 0 :(得分:4)

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

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

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

我不确定是否比if-else清晰得多:从长远来看,带有if-else的稍长版本可能更易于理解和维护。


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

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))

答案 1 :(得分:3)

如何使用rightT中的EitherT

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