Scala 任务 return 映射

Scala Task return mapping

我有一个方法 readHeader,它接受一个参数和 returns Task[List[Header]],另一个方法调用多个 ID 和 returns List[任务[List[EquipmentHeader]]]。 如何使 Task[List[List[Header]]] 的 return 与多个 ID 读取功能兼容。

trait M1{
  def readHeader(id: String): Task[List[Header]]
}

def read(ids: List[String])(implicit m1:M1):Task[List[List[Header]]] = {
    if (ids.isEmpty) {
      Task(List.empty)
    } else {
         ids.map(m1.readHeader(_)) //List[Task[List[Header]]]
    }
  }

您可以使用 traverse 来自 cats:

import cats.implicits._

ids.traverse(m1.readHeader) // Task[List[List[Header]]]

这里是 traverse 的简单实现,仅用于 TaskList.
但我再次强调,没有理由不使用 cats.

中定义的那个
def traverse[A, B](list: List[A])(f: A => Task[B]): Task[List[B]] = {
  @annotation.tailrec
  def loop(remaining: List[A], acc: Task[List[B]]): Task[List[B]] =
    remaining match {
      case a :: as =>
        loop(
          remaining = as,
          acc = for {
            b <- f(a)
            bs <- acc
          } yield b :: bs
        )

      case Nil =>
        acc.map(_.reverse)
    }
  loop(remaining = list, acc = Task.pure(List.empty))
}