我正在一个发现猫的EitherT
类型的项目中工作。在我的一项任务中,当它们全部为[[right时,我想将Seq
的生产者的EitherT[Future, L, R]
减少为EitherT[Future, L, Seq[R]]
。并中止还原,否则返回失败的LeftT[Future, L, Seq[R]]
。
type Producer = () => EitherT[Future, L, Seq[R]] // where L and R are known types.
private def execute(producers:Seq[Producer]):EitherT[Future, L, Seq[R]] = {
producers match {
case last :: Nil =>
last()
case current :: nexts =>
current().flatMap(res => execute(nexts).map(res ++ _))
}
}
但是我找不到一种处理LefT
的干净方法。关于如何处理我的遗留案件,您有什么建议吗?谢谢
Edit:因为可能不够清晰。
我的输入是Seq[Producer]
(应用时[A C0]给出Producer
)。我想应用生产者并将其减少到一个EitherT
,但是如果一个生产者失败(返回一个包含EitherT
的EitherT
),则必须中止该过程。给出:
[
Left
,P1
和P2
,三个生产者分别返回P3
,Right
,EitherT
和Seq(A)
- 减少
Seq(B)
将返回Seq(C, D)
的Seq(P1, P2, P3)
。给出: [
EitherT
和Right(Seq(A, B, C, D))
,两个生产者分别返回P1
P3
,Right
和EitherT
[ Seq(A)
一个生产者返回一个'Left(“ fail”)Seq(C, D)
的还原将返回P2
的Seq(P1, P2, P3)
。
EitherT
Left("fail")
中的 import cats.implicits._
val success = List(
EitherT.right[Int](Option("1")),
EitherT.right[Int](Option("2")))
println(success.sequence) // EitherT(Some(Right(List(1, 2))))
val error = success :+ EitherT.left[String](Option(3))
println(error.sequence) // EitherT(Some(Left(1)))
方法>sequence