问题标签 [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 投票
2 回答
1451 浏览

scala - Scala中无限流的嵌套迭代

我有时发现自己想在 Scala 中对无限流执行嵌套迭代以进行理解,但指定循环终止条件可能有点棘手。有没有更好的方法来做这种事情?

我想到的用例是我不一定预先知道我正在迭代的每个无限流需要多少元素(但显然我知道它不会是无限的)。假设每个流的终止条件可能以某种复杂的方式依赖于 for 表达式中其他元素的值。

最初的想法是尝试将流终止条件编写为for表达式中的if过滤器子句,但是在循环嵌套无限流时会遇到麻烦,因为无法短路第一个无限流上的迭代,最终导致 OutOfMemoryError。我理解为什么会这样,考虑表达式如何映射到mapflatMapwithFilter方法调用——我的问题是是否有更好的习惯来做这种事情(也许根本不涉及理解)。

为了给出一个有点人为的例子来说明刚刚描述的问题,考虑以下(非常天真的)代码来生成数字 1 和 2 的所有配对:

显然,在这个简单的示例中,可以通过将if过滤器移动到对原始流的takeWhile方法调用来轻松避免该问题,如下所示:

但是为了这个问题的目的,想象一个更复杂的用例,其中流终止条件不能轻易移动到流表达式本身。

0 投票
4 回答
4355 浏览

scala - 有没有办法在 for 理解中声明一个隐式 val?

我有一些嵌套调用 flatMap 的代码,如下所示:

通常,人们会将其写为 for 理解,这使代码更具可读性:

但我需要f隐含,我看不出用理解来做到这一点。有没有?当然我可以明确地传递 f,但这意味着再见漂亮的 DSL。我会对 Scala 2.9 和 2.10 的答案感兴趣。

为了清楚起见,我想做这样的事情,但它不会编译:

编辑:也许功能请求是个好主意?

EDIT2:这应该适用于可用于理解的所有类型,因此不仅适用于通常的集合类型,如Listor Seq,而且适用于Future.

0 投票
1 回答
3372 浏览

scala - Scala for-comprehensions 中 val 的作用域规则是什么

当我在理解中使用 val 时,我收到警告:

警告:不推荐使用用于理解的 val 关键字

尽管在规范的语法附录中产生。

这表明当我做类似的事情时

我并没有真正引入变量,例如如果我做类似的事情

像往常一样,大括号开始一个新的范围,我可以在其中引入一个新的 val,甚至是一个新的隐式。

我到底在做什么a

我在消耗堆栈空间吗?堆?其他类型的别名?

0 投票
1 回答
317 浏览

scala - Scala 用于理解的可索引数据结构

我刚刚在 Coursera 上观看了 Martin Odersky 的第 6 周关于 Scala 的讲座。在第 5 讲中,他说

“... for的翻译不仅限于列表或序列,甚至是集合;

它仅基于方法map、flatMap 和 withFilter的存在。

这让你也可以为你自己的类型使用 for 语法——你必须只为这些类型定义 map、flatMap 和 withFilter。”

我要解决的问题是我们有一个批处理过程,它从几个数据库加载数据、组合数据并以某种方式导出结果。数据小到可以放入内存(每个源系统有 100,000 条记录),但大到足以考虑性能。

我可以使用传统的内存数据库(如 H2)并通过 ScalaQuery 或类似的东西访问它,但我真正需要的只是一种能够有效地搜索和连接来自不同源系统的数据的方法——相当于 SQL 的索引和加入。使用成熟的关系数据库 + Scala ORM 来处理可以通过一些 Scala 原生的数据结构轻松有效地解决的问题,感觉真的很尴尬。

我的第一个天真的方法是结合一个或多个“索引”(可以像在数据库系统中一样实现为 B 树)的 Vector 数据结构(用于快速直接访问)。这种组合数据结构的map、flatMap、withFilter方法可以足够智能以使用索引,如果它们有一个用于查询字段的索引 - 或者它们可以有一个“提示”来使用索引。

我只是想知道这样的数据结构是否已经存在并且可用,还是我需要自己实现它们?是否有解决此问题的 Scala 库或集合框架?

0 投票
5 回答
23465 浏览

scala - Scala 中的 Future[Option] 用于理解

我有两个返回期货的函数。我正在尝试使用 for-yield 理解将修改后的结果从第一个函数提供给另一个函数。

这种方法有效:

但是,我对其中的“if”不满意,看来我应该能够使用地图。

但是当我尝试使用地图时:

我得到一个编译错误:

我玩过一些变化,但没有发现任何有吸引力的东西。谁能提出更好的理解和/或解释我的第二个例子有什么问题?

这是一个使用 Scala 2.10 的最小但完整的可运行示例:

0 投票
1 回答
403 浏览

scala - Scala 的 for-comprehension 优化(恒等映射)

我怎样才能避免map(identity)在 Scala 中的for理解?

例如,考虑:

IIUC,for-comprehension 转换为类似

我可以map(identity)以某种方式避免尾随吗?或者Scala是否/可以/可以优化它?(我想它不能,因为不清楚是否map有任何副作用,对吧?)

PS我知道在这个特定的例子中,事情可以改进。我想知道一般情况,例如Future { value * 2}调用返回未来f(value)的函数。f

0 投票
5 回答
38704 浏览

scala - 对 flatMap/Map 转换的理解感到困惑

我似乎真的不了解 Map 和 FlatMap。我不明白的是,理解如何是对 map 和 flatMap 的一系列嵌套调用。以下示例来自Scala 中的函数式编程

翻译成

mkMatcher 方法定义如下:

模式方法如下:

如果有人可以在这里阐明使用 map 和 flatMap 背后的基本原理,那就太好了。

0 投票
1 回答
276 浏览

scala - 如何为具有协变/逆变类型参数的类定义 flatMap?

假设我们有一个具有协变和逆变类型参数的类:

我们为这个类的实例定义了单子操作:

为了能够使用for-comprehension,我们需要它flatMap是 trait 本身的一个方法:

但是,这不会编译,它失败了

逆变类型I出现在(R) => Pipe[I,O,R1]value 类型的协变位置f

(协变类型参数也会出现类似的错误。)

我了解限制以及问题发生的原因。但是是否有一些解决方法,如何flatMap使用Pipes.flatMap与上述相同的语义来定义特征?也许使用一些隐式转换和/或中间构建器类?

0 投票
3 回答
1459 浏览

list - 无法将 Try 扁平化为 for 理解

这是一个文体问题和我试图拓宽对 Scala 理解的尝试的结合。

我有一个包含 Future 的列表,我想计算期货的值,转换为 Option,并使用 for 理解来展平列表:

我想要做的是让扁平化阶段进入理解,有人有什么建议吗?

0 投票
1 回答
164 浏览

coffeescript - 是否可以通过咖啡脚本理解从回调中收集结果?

假设我有一组对象,每个对象都有一些异步readValue函数,它接受回调作为其参数,当该对象有可用值时将触发该回调。

我的目标是计算每个对象的所有值并返回包含这些值的数组。

首先进入我脑海的是这个

由于readValue方法是异步的,因此调用它的函数也是异步的。当所有值都在result数组中时,callback函数将被执行。

但这一切对我来说似乎很混乱。这是咖啡脚本真正强大的领域。是否可以使用更少的带有理解的代码来编写这个函数?如果它是同步的,那没关系。