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
的简单实现,仅用于 Task 和 List.
但我再次强调,没有理由不使用 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))
}
我有一个方法 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
的简单实现,仅用于 Task 和 List.
但我再次强调,没有理由不使用 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))
}