为什么这个从未来列表到未来列表的转换能够编译并起作用?

2024-02-21

免责声明:下面的代码片段与正在进行的 Coursera 课程之一相关。 我们假设它只是出于学习目的而发布,不应用于作为家庭作业的解决方案提交。

正如下面的评论所述,我们需要将 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))

特别是,我不明白其中接下来的事情:

  1. 哪里有Future[T] -> T转变发生吗?看起来像xs <- fs2是我们最初接触的唯一地方Futures,以及每个xs类型应该是Future[T](但不知怎的,它变得只是T).
  2. 故障如何处理?看起来像结果Future当输入之一时,对象确实失败Futures失败。

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

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

将 Future f 的结果存储在 t 中 - 因此 t 的类型为 T。yield 将其转换为 List[T],整个 for-compression 的类型最终为 Future[List[T]]。因此,for-composition 就是从你的 T 中提取 T 的地方。Futures,对它们做一些事情,然后将它们放回 Future(好吧,我在这里稍微简化一下)。

它相当于

f.map(t => List(t))

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

总而言之,Scala 中的 for 理解只是糖,可以用以下代码重写map, flatMap, filter, foreach.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么这个从未来列表到未来列表的转换能够编译并起作用? 的相关文章

随机推荐

  • AcquireTokenForClient (MSAL) 是否使用令牌缓存?

    我 成功 使用客户端凭据流与 MSAL 来验证应用程序 如下所示 private static async Task
  • 使用 parfor 节省时间和内存?

    考虑prova mat在MATLAB中通过以下方式获得 for w 1 100 for p 1 9 A p randn 100 1 end baseA A A eval baseA A num2str w baseA end save sp
  • JQuery:动态高度()与窗口调整大小()

    我遇到了与此海报相同的问题 Jquery height 和 resize 问题 https stackoverflow com questions 4931700 jquery problem with height and resize
  • shell脚本中的top命令

    我正在尝试通过 Expect 脚本获取 top 命令的前 5 行 我从 shell 脚本中调用这个期望脚本以及其他一些东西 top head 5给我以下输出 即没有 cpu 统计信息 顶部 09 10 58 向上 46 天 17 03 12
  • Swift随机数[重复]

    这个问题在这里已经有答案了 我在使用drawRandomCard 函数时遇到问题 它在一段时间内正常工作 但最终会使应用程序崩溃 这是代码 import Foundation var cardDeck Array
  • 如何在 Heroku 上使用 Zerigo DNS 将根级域重定向到 www 子域? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在将根域重定向到 www 子域时遇到问题 例如 将 blahblahblah com 重定向到 www blahblahblah com
  • 如何防止 dbms_output.put_line 修剪前导空格?

    我正在尝试右对齐某些 PL SQL 代码的输出 但 dbms output put line 正在修剪字符串中的前导空格 我该如何让它停止 或者有没有更好的方法来输出带有前导空格的字符串 dbms output put line lpad
  • Webdriver JS 测试期间无法切换窗口

    在使用 Jasmine JS 通过 Selenium Webdriver 进行测试期间 我无法切换窗口 跑步者 量角器 JS 平台 Node JS 上的 Selenium Webdriver 代码框架 Jasmine JS 代码如下 请注意
  • 在 Apache 服务器上使用 Sudo 权限运行 Python CGI 脚本

    我是在 Apache 2 2 22 http 服务器上使用 Ubuntu 12 04 的 python CGI 新手 我正在编写一个脚本来创建其他 python 脚本 这些创建的脚本必须具有 chmod x 权限才能执行 创建脚本的脚本必须
  • Spring Integration 在没有轮询器的情况下监听队列

    我想使用 Spring Integration 实现 HTTP 端点 它监听 http 请求 将请求数据作为消息发送到通道 另一个端点应该监听该通道上的消息并处理它们 听起来很简单 但我想要实现的是 消息应该按顺序处理 应尽快处理消息 如果
  • android 中 ?attr/colorControlHighlight 的默认颜色是什么?

    我需要知道 android 中 attr colorControlHighlight 的默认颜色 因为我需要为预棒棒糖设备的可绘制对象中的按钮按下状态背景应用相同的颜色 attr colorControlHighlight 是 lollip
  • 更改 UIImagePicker 的纵横比

    所以我尝试在我的 iOS 应用程序中制作一个自定义相机 我想让相机像快照一样全屏显示 但我找不到任何地方可以帮助我将宽高比从 4 3 默认 更改为 16 9 iPhone 5 和 5s 4 英寸屏幕 有人能指出我正确的方向吗 这里有点无耻的
  • 如何获取夏令时的开始和结束日期?

    我正在尝试获取 Android 中夏令时的转换日期 这是特定时区夏令时开始和结束的日期 我怎么做 无法直接执行此操作 但您可以使用 TimeZone isDaylightTime Date 如下所示 TimeZone tz TimeZone
  • AOL 的开发者 API 密钥问题

    我正在使用 AOL 登录创建一个新应用程序 为此 我需要开发人员 api 密钥 我获取了 Facebook twitter 的 api 密钥 但对于 aol com 当我打开 dev aol com 时 它总是重定向到 www aol co
  • 通过 ajax 刷新数据时覆盖表单“重置”行为

    我依靠表单的 重置 行为来取消编辑 我面临的问题是 一旦发布数据通过ajax更新 重置仍然会恢复到最初随页面加载的数据 所以基本上我需要做的是 重置 重置 功能 合理 尝试这个 yourForm bind reset function re
  • 如何比较两个具有非连续顺序的随机数的文件?

    有 2 个名为 compare 1 txt 和 compare2 txt 的文件 其中包含非连续顺序的随机数 猫比较1 txt 57 11 13 3 889 014 91 猫比较2 txt 003 889 13 14 57 12 90 Ai
  • 如何在不使用边框的情况下更改 a 标签的下划线粗细?

    我经常对按钮使用 a 标签 因此它们有一个填充 使它们像按钮一样 如何更改文本装饰下划线的粗细 人们经常建议为此使用边框底部 但是 底部边框不是下划线 有些字母甚至延伸到下划线以下 下划线比某物下面的线复杂得多 正如所解释的 我已经使用了相
  • 如何将 .NET 库移动到子目录?

    我想将我的应用程序使用的所有库 dll 放入一个子目录 假设名为 lib 如何指示程序集加载器在该特定目录 这是主程序集所在的目录的子目录 中查找引用的程序集 我认为应该通过 app config 中的一些设置来完成 对吗 探测路径 htt
  • 哈希表中关键内容的最佳实践

    最好的查找结构是HashTable 它提供持续的访问一般 最坏情况下呈线性 这取决于哈希函数 好的 我的问题如下 假设一个良好的实施HashTable e g HashMap关于映射中传递的键是否有最佳实践 我的意思是建议键必须是不可变的对
  • 为什么这个从未来列表到未来列表的转换能够编译并起作用?

    免责声明 下面的代码片段与正在进行的 Coursera 课程之一相关 我们假设它只是出于学习目的而发布 不应用于作为家庭作业的解决方案提交 正如下面的评论所述 我们需要将 Future 列表转换为列表的单个 Future 更重要的是 如果至