Scala-EitherT

时间:2018-08-31 21:28:35

标签: scala scala-cats

假设我有以下内容:

val ints: Seq[Int] = ???
def foo(i: Int): EitherT[Future, Error, Seq[String]] = ???

我想用foo调用ints并累积Seq[String]结果以最终返回EitherT[Future, Error, Seq[String]]

ints.map(i => foo(i))

很明显,以上返回Seq[EitherT[Future, Error, Seq[String]]],但这不是我想要的。当fooError中首次返回map时,我想停止遍历并返回错误。

实现我的目标的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

ints.map(foo).reduce(for { a <- _ ; b <- _ } yield a ++ b)

这基本上可以满足您的要求,但我认为这不完全符合该句子的要求:

  

当foo在地图中首次返回Error时,我想   停止遍历并返回错误。

问题在于您需要在任何期货完成之前遍历seq,因此您不知道它们是否返回错误。您可以一个一个地“阻塞”,而在上一个操作完成之前不进行对foo的下一个调用,但是这样您就不会获得任何并行性。从理论上讲,有可能先启动所有这些期货,然后在一个错误返回时取消仍在运行的期货,但是不幸的是,取消期货并不是一件容易的事。