问题标签 [for-comprehension]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
562 浏览

scala - Scala中的理解评估奇怪(?)

现在,我花了一段时间才弄清楚为什么我的递归以某种方式设法破坏了堆栈。这是导致此问题的部分:

这不是,像,疯了吗?为什么要评估j = ...它是否以结尾if false并且永远不会被使用?

我了解到,当{ println ... }你有一个递归调用(以及递归保护而不是)时会发生什么。if false:<

为什么?!

0 投票
6 回答
22277 浏览

scala - 用过滤器代替过滤器

在之后应用地图、平面地图等功能时,使用 withFilter 而不是 filter 总是更高效吗?

为什么只支持 map、flatmap 和 foreach?(预期的功能,如 forall/exists 以及)

0 投票
4 回答
8387 浏览

scala - 当对其中一项的检查返回 false 时结束 for-comprehension 循环

我对 Scala 有点陌生,所以如果这有点微不足道,我深表歉意。

我有一个要迭代的项目列表。我对每个项目执行检查,如果其中一个失败,我希望整个函数返回 false。因此,您可以将其视为 AND 条件。我希望它被懒惰地评估,即我遇到第一个假的那一刻返回假。

我习惯于for - yield过滤通过某些生成器(项目列表、序列等)生成的项目的语法。然而,就我而言,我只想在不执行其余循环的情况下中断并返回 false。在普通的 Java 中,只需return false;在循环内执行 a 即可。

以一种低效的方式(即当我遇到第一个错误项目时不停止),我可以这样做:

这实质上是说,如果没有项目通过过滤器,则所有项目都满足条件。但这似乎有点令人费解且效率低下(假设您有 100 万个项目,而第一个项目已经不满足条件)。

在 Scala 中最好和最优雅的方法是什么?

0 投票
1 回答
516 浏览

scala - 避免在对一系列混合项目的理解中进行类型转换

我知道打字在 Scala 中很重要,理想情况下你可以通过使用模式匹配之类的东西来绕过类型转换或任何混乱的解决方案。但是,如果我正在遍历作为常见超类型的子类型的项目列表或项目序列,并且只想要该子类型的序列中特定子类型的项目,我无法理解我该怎么做。我不认为我可以在 a 中放置模式匹配for-comprehension来实现这一点。

因此,例如,我有这些课程:

我有 aSeq[SuperType]并且我想获得 aSeqSubtypeA实例,所以 a Seq[SubTypeA],这样我就可以遍历它并执行SubTypeA为所有元素提供的方法。

0 投票
4 回答
437 浏览

scala - 将一组成对的集合展平为一对集合

我有一个for-comprehension来自 a 的生成器,Set[MyType]MyType有一个lazy val名为的变量factsPair,它返回一对集合:(Set[MyFact], Set[MyFact])。

我希望遍历所有这些并将事实统一为一对扁平的(Set [MyFact],Set [MyFact]),如下所示,但是我遇到了No implicit view available ...错误not enough arguments for flatten: implicit (asTraversable ...。(我对 Scala 有点陌生,所以仍在努力适应错误)。

我需要指定什么来使其变平才能工作?

0 投票
1 回答
113 浏览

scala - 为每个槽生成值的排列

好的,我必须在这里与一些愚蠢的事情作斗争(Scala 的新手),在这种情况下,如果它是微不足道的,请道歉。

我有一个类Action,它带有一个名称(与问题无关)和一个列表参数。

每个参数都有一组可能的值,我想为Action. 我一直在尝试使用 afor-comprehension但不是填写所有参数,而是只替换了一个值的组合。

我的代码看起来像这样(我简化它只是为了说明问题):

该函数replaceParam只返回一个参数替换为参数的操作。

因此,如果我有带有参数 A、B、C 的 action1,每个参数都可以采用 {a1、a2、a3}、{b1、b2、b3} 和 {c1、c2、c3} (假设它们属于同一类型) ,我最终得到:

action1(a1, B, C) , action1(A, b1, C), action1(A, B, c1), action1(a2, B, C) 等。

但我想要的是:

动作1(a1,b1,c1),动作1(a1,b1,c2),动作1(a2,b1,c1)等。

实现这一目标的最优雅的方法是什么?

0 投票
2 回答
2898 浏览

scala - 为什么这个未来列表到未来列表的转换可以编译和工作?

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

正如下面的评论所述,我们需要将 Future 列表转换为列表的单个 Future。不仅如此,如果至少有一个输入期货失败,则生成的未来应该失败。

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

特别是,我不明白其中的以下内容:

  1. Future[T] -> T转变发生在哪里?它看起来xs <- fs2是我们唯一接触 initial 的地方Futures,每种xs类型都应该是Future[T](但不知何故它变成了 just T)。
  2. 故障如何处理?当其中一个输入失败时,结果Future对象似乎确实失败了Futures
0 投票
2 回答
1547 浏览

scala - flatMap 与 for-comprehension 相比的性能差异

我对 Scala 还是很陌生,我读到的其中一件事是,理解在某种程度上等同于 flatMap。但是,在我的代码(如下)中,flatMap 的计算时间至少是原来的两倍。这可能是什么原因?

这是慢的:

这是快速等效的:

factActionsMapFact是和之间的映射Set[Action]facts只是一个Set[Fact]

0 投票
2 回答
573 浏览

scala - 对于理解过滤选项

我有一组项目,让我们调用它们Effect,我有一个列表,Cause其中包含一组possibleEffects : Set[Effect]

我需要遍历效果列表,只返回Cause我为每个效果找到的第一个Effect。可能有重叠的原因会导致多个结果,这就是结果需要放在一个集合中的原因。我需要它尽可能快,因为它执行了很多次。我想出了以下方法(不确定这是否是最好的方法,我是 scala 的新手)。

我正在尝试使用find()返回Option[Cause]. 有没有办法过滤掉那些返回的None(实际上不会发生,列表中总会有原因,除非我有错误),然后从 for 理解中的 Some monad 中提取它?我似乎无法在matches其中使用。

0 投票
3 回答
2955 浏览

scala - 用于理解的 Future[Option[Boolean]] .. 简单吧?

假设我有:

我可以这样做:

我想对此的理解将是:

但这不起作用!我收到一个错误,即:

如何在 for 理解中使用 Future[Option[Boolean]] 来提取或转换布尔值?

注意:这是我目前遇到的许多 Future[Option[Boolean]] 变量的简化,我想在理解中一起使用这些变量。