gpt4 book ai didi

scala - 用于带有错误累积的异步处理的函数签名

转载 作者:行者123 更新时间:2023-12-02 19:34:54 25 4
gpt4 key购买 nike

假设我有一个函数fab: A => Future[B]。现在我需要编写新函数 foo 来处理 Seq[A] 并累积所有错误。这就是为什么我不能使用 Future.traverse因为它“快速失败”并且不会累积错误。

foo 接收 Seq[A] 并应返回 Future。对于输入 Seq[A] 的每个元素,客户端应获取 B 或异常。该函数的签名是什么?

最佳答案

定义foo对于您需要的内容,请考虑使用 Future.sequencemap/recover之上申请后fab到输入列表的各个元素,如下所示:

import scala.concurrent.{ Future, ExecutionContext }

def foo[A, B](ls: List[A])(fab: A => Future[B])(implicit ec: ExecutionContext):
Future[List[Either[Throwable, B]]] =
Future.sequence(ls.map(fab).map(_.map(Right(_)).recover{ case e => Left(e) }))

请注意,而不是 Seq ,不可变List是首选,因此在这里使用。将其更改为 Seq如果需要的话。

测试foo :

implicit val ec = ExecutionContext.global

def fab(s: String): Future[Int] = Future{ 10 / s.length }

val ls = List("abcd", "", "xx", "")

foo(ls)(fab)
// res1: Future[List[Either[Throwable, Int]]] = Future(Success(List(
// Right(2),
// Left(java.lang.ArithmeticException: / by zero),
// Right(5),
// Left(java.lang.ArithmeticException: / by zero)
// )))

关于scala - 用于带有错误累积的异步处理的函数签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59347156/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com