2

如何在 scala 中将List[Task[List[Header]]]类型转换为 Task[List[Header]] 。

我有一个方法返回 Task[List[Header]] 并多次调用 dor 它变成 List[Task[List[Header]]]

4

2 回答 2

6

您可以使用Task.sequence,然后映射flatten到列表的结果列表,例如:

val res: List[Task[List[Header]]] = ...
Task.sequence(res).map(_.flatten)

如果您需要对结果进行并行执行,可以查看Task.gather.

于 2019-12-19T12:13:26.543 回答
4

该用例包含在函数中flatSequencehttps ://github.com/typelevel/cats/blob/v2.1.0/core/src/main/scala/cats/Traverse.scala#L86

如您所见,它需要 aF[G[F[A]]并将其转换为G[F[A]]. 现在FListG替换Task,你就得到了你需要的东西。这将适用于任何F带有TraverseFlatMap实例的任何东西以及任何G带有Applicative实例的东西。

如果你想并行运行任务,你可以parFlatSequence在这里找到:https ://github.com/typelevel/cats/blob/v2.1.0/core/src/main/scala/cats/Parallel.scala#L155

于 2019-12-20T15:22:49.960 回答