gpt4 book ai didi

scala - 为什么这个 future 列表到 future 列表转换编译和工作?

转载 作者:行者123 更新时间:2023-12-04 14:28:44 25 4
gpt4 key购买 nike

免责声明:下面的代码片段与正在进行的 Coursera 类(class)之一有关。
让我们考虑一下它只是为了学习目的而发布的,不应该用于提交作为家庭作业的解决方案。

正如下面的评论所述,我们需要将 Future 列表转换为列表中的单个 Future。更重要的是,如果至少有一个输入 future 失败,则生成的 Future 应该失败。

我遇到了以下实现,我不完全理解。

/** Given a list of futures `fs`, returns the future holding the list of values of all the futures from `fs`.
* The returned future is completed only once all of the futures in `fs` have been completed.
* The values in the list are in the same order as corresponding futures `fs`.
* If any of the futures `fs` fails, the resulting future also fails.
*/
def all[T](fs: List[Future[T]]): Future[List[T]] =
fs.foldRight(Future(Nil:List[T]))((f, fs2) =>
for {
x <- f
xs <- fs2
} yield (x::xs))

特别是,我不明白接下来的事情:
  • 在哪里Future[T] -> T转变发生了吗?它看起来像 xs <- fs2是我们唯一接触首字母的地方 Futures ,以及每个 xs类型应该是 Future[T] (但不知何故,它变成了 T )。
  • 故障如何处理?看起来像结果 Future当输入 Futures 之一时对象确实失败失败。
  • 最佳答案

    1) 说 f 是 Future[T] ,然后写

    for {
    t <- f
    } yield List(t)

    将 Future f 的结果存储在 t 中 - 因此 t 的类型为 T。 yield 将其转换为 List[T],并且整个 for-comprehension 的类型最终为 Future[List[T]]。所以 for-comprehension 是你从 Futures 中提取 Ts 的地方。 ,用它们做一些事情,然后把它们放回 Future (好吧,我在这里简化了一点)。

    它相当于
    f.map(t => List(t))

    2) 如果你的 Future f 包含一个失败,那么 for-comprehension 将只返回这个失败的 Future 而不是执行 yield。

    作为一般说明,Scala 中的 for-comprehension 只是可以用 map, flatMap, filter, foreach 重写的糖。 .

    关于scala - 为什么这个 future 列表到 future 列表转换编译和工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20307175/

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