Monad transformers-Scalaz-List[Future[String\/String]]到Future[String\/String]
我想知道如何将Monad transformers-Scalaz-List[Future[String\/String]]到Future[String\/String],scala,future,scalaz,monad-transformers,either,Scala,Future,Scalaz,Monad Transformers,Either,我想知道如何将列表[Future[String\/String]转换为未来[String\/String] 事实上,我只想应用列表中的每个元素EitherT.apply 我想要的是这样的: val result: EitherT[Future, String, String] = for{ _ <- EitherT.apply(fun(arg1)) _ <- Eit
列表[Future[String\/String]
转换为未来[String\/String]
事实上,我只想应用列表中的每个元素EitherT.apply
我想要的是这样的:
val result: EitherT[Future, String, String] =
for{
_ <- EitherT.apply(fun(arg1))
_ <- EitherT.apply(fun(arg2))
res <- EitherT.apply(fun(arg3))
} yield res
result.run
// ...
def fun(arg1: MyType): Future[String\/String] = ...
val结果:EitherT[未来,字符串,字符串]=
为了{
_我找到了一种不用EitherT.apply的方法
def seqCheck(elements: List[Element]): Future[String\/String] = elements match {
case element :: tail =>
fun(element) flatMap {
case \/-(_) =>
seqCheck(tail)
case -\/(e) => Future{
-\/(e)
}
}
case Nil =>
Future {
\/-("Ok")
}
}
它不像我希望的那么好,但似乎很管用。
如果有人知道最好的方法…我已经找到了一种方法,但不使用EitherT.apply
def seqCheck(elements: List[Element]): Future[String\/String] = elements match {
case element :: tail =>
fun(element) flatMap {
case \/-(_) =>
seqCheck(tail)
case -\/(e) => Future{
-\/(e)
}
}
case Nil =>
Future {
\/-("Ok")
}
}
它不像我希望的那么好,但似乎很管用。
如果有人知道一个最好的方法…可以做到。我想你忘记了输出类型中的一些东西-你输入了一个列表
,但你只得到一个元素?谢谢!@GáborBakos Future.sequence很好,但是性能如何?@lmm事实上我只想一个接一个地检查每个元素的乐趣的结果如果有一个返回左边(失败),则返回这个,否则返回\/-(“确定”).我已经找到了一种方法。看看我的答案。我能做到。我想你忘记了输出类型中的一些东西-你输入了一个列表,但你只得到了一个元素?谢谢!@GáborBakos Future.sequence很好,但是性能呢?@lmm事实上我只想一个接一个地检查乐趣的结果列表的每个元素。如果有一个返回左(失败),则返回此元素,否则返回\/-(“确定”).我已经找到了一种方法。看看我的答案。我能做到。我想你忘记了输出类型中的一些东西-你输入了一个列表,但你只得到了一个元素?谢谢!@GáborBakos Future.sequence很好,但是性能呢?@lmm事实上我只想一个接一个地检查乐趣的结果列表中的每一个元素。如果有一个返回左(失败),则返回此元素,否则返回\/-(“确定”)。我找到了一种方法。请参阅我的答案。