对于理解 Future 和 Either
For comprehensions Future and Either
我正在努力研究如何以一种很好的 monadic 方式组合一系列异步进程。该过程的每个步骤都可能失败,因此它正在检索 Future[Either[String, T]]
.
def firstStep(input: Int): Future[Either[String, Long]] = ???
def secondStep(input: Long): Future[Either[String, String]] = ???
def thirdStep(input: String): Future[Either[String, Double]] = ???
鉴于这些功能,我想像这样组合它们
def process(input: Int): Future[Either[String Double]] = {
for{
res1 <- firstStep(input)
res2 <- secondStep(res1)
res3 <- thirdStep(res2)
} yield res3
}
但这不起作用,因为每个部分结果都是一个 Either[String, T]
,而我需要的是 T
本身(或者只是停止执行和 return Left
如果是这样的话)。
如何以一种很好的单子方式(使用 for-comprehensions)组合这个函数?
一个 EitherT
monad 转换器可以提供帮助,无论是(双关语)来自猫还是 scalaz:
import cats._
import cats.implicits._
import cats.EitherT
def process(input: Int): Future[Either[String, Double]] = {
val res = for {
res1 <- EitherT(firstStep(input))
res2 <- EitherT(secondStep(res1))
res3 <- EitherT(thirdStep(res2))
} yield res3
res.value
}
我正在努力研究如何以一种很好的 monadic 方式组合一系列异步进程。该过程的每个步骤都可能失败,因此它正在检索 Future[Either[String, T]]
.
def firstStep(input: Int): Future[Either[String, Long]] = ???
def secondStep(input: Long): Future[Either[String, String]] = ???
def thirdStep(input: String): Future[Either[String, Double]] = ???
鉴于这些功能,我想像这样组合它们
def process(input: Int): Future[Either[String Double]] = {
for{
res1 <- firstStep(input)
res2 <- secondStep(res1)
res3 <- thirdStep(res2)
} yield res3
}
但这不起作用,因为每个部分结果都是一个 Either[String, T]
,而我需要的是 T
本身(或者只是停止执行和 return Left
如果是这样的话)。
如何以一种很好的单子方式(使用 for-comprehensions)组合这个函数?
一个 EitherT
monad 转换器可以提供帮助,无论是(双关语)来自猫还是 scalaz:
import cats._
import cats.implicits._
import cats.EitherT
def process(input: Int): Future[Either[String, Double]] = {
val res = for {
res1 <- EitherT(firstStep(input))
res2 <- EitherT(secondStep(res1))
res3 <- EitherT(thirdStep(res2))
} yield res3
res.value
}