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))
所以我有一个特定的函数,只有在特定条件为真时我才需要调用它。如果它是假的,我认为它是对的。
我会使用 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))