所以我有一个特定的函数,只有在特定条件为真时才需要调用。如果它是错误的,我认为它是正确的。
我会使用 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
}
我想知道是否还有一种更优雅的方法。不胜感激。
答案 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
}