Monad 转换器 - Scalaz - List[Future[String\/String]] 到 Future[String\/String]
Monad transformers - Scalaz - List[Future[String\/String]] to Future[String\/String]
我想知道如何将 List[Future[String\/String]]
转换为 Future[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] = ...
在此示例中,我想将函数 fun
和函数 fun
的参数列表(包含 n 个元素)设置为输入(此处:List(arg1, arg2, arg3)
) .
但我不知道如何使用 Futures 进行管理。
是否可以保持异步?
我找到了一种方法,但没有使用 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")
}
}
它没有我想要的那么好,但它似乎有效。
如果有人知道最好的方法...
我想知道如何将 List[Future[String\/String]]
转换为 Future[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] = ...
在此示例中,我想将函数 fun
和函数 fun
的参数列表(包含 n 个元素)设置为输入(此处:List(arg1, arg2, arg3)
) .
但我不知道如何使用 Futures 进行管理。 是否可以保持异步?
我找到了一种方法,但没有使用 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")
}
}
它没有我想要的那么好,但它似乎有效。 如果有人知道最好的方法...