当前位置: 首页 > 知识库问答 >
问题:

Scala中用于理解的补救语法问题

洪鸿
2023-03-14

我在Scala 2.10中遇到了语法问题,无法理解。

< code>for(a

那么为什么for(a

类型检查器抱怨第二个表达式(< code>b


共有2个答案

拓拔辰钊
2023-03-14
匿名用户

丹尼尔解释了其中的复杂性。但是我想补充一些细节,因为正如你所看到的,我发现这种行为非常不直观,我自己也遇到过几次混合OptionList的问题。这特别烦人,因为正如你所看到的,它只在一个方向上工作,而不是另一个。

因此,根据您将拥有的用于理解的规则

def test(a: Option[List[Int]]) = a.flatMap(_.map(identity))

失败与

<console>:7: error: type mismatch;
 found   : List[Int]
 required: Option[?]
           def test(a: Option[List[Int]]) = a.flatMap(_.map(identity))
                                                           ^

但你可以让它工作:

def test(a: Option[List[Int]]) = (a: Iterable[List[Int]]).flatMap(_.map(identity))

test(Some(List(1,2)))  // List(1,2)

或使用<code>返回</code>:

for(a <- Some(List(1,2)).toIterable; b <- a) yield b

< code>for应该自己进行这种转换吗?老实说,我不知道,但我和你一样惊讶它不起作用。

佴德曜
2023-03-14
匿名用户

我最近解释了这一点——希望有人能找到链接。这是一个反复出现的问题,因此很可能会被关闭。

无论如何,外部发生器控制着表象。这发生在每一层,所以如果我有这个:

for { 
  a <- A
  b <- B
  c <- C
} yield f(a, b, c)

那么< code>f(a,B,c)的表示由< code>C控制,其表示由< code>B控制,最终结果的表示由< code>A控制。因此,出于最实际的目的,理解的表征是由第一个发生器控制的。

那么我说的“代表”是什么意思呢?好吧,理解通常是一种单一理解(实际上,它只是对flatMapmap方法的一组调用,因此它可以是任何类型检查)。这意味着给定一个 monad M[A] 和一个函数 A =

这意味着,在大多数情况下,不可能将选项列表组合在一起进行理解。所有集合在GenTraversableOnce中都有一个共同的父级,因此将它们组合起来没有问题(尽管事情比引擎盖下要复杂得多)。

但是,存在从< code>Option到< code>Iterable的隐式转换。既然如此,当Scala找到< code>b时

但是,在第二种情况下不会发生这种情况。使用 Option 进行理解是可以的,因此无需将其转换为可迭代。不幸的是,人们无法将列表转换为选项(这种转换的结果是什么?),这会导致错误。

Scala不会“回溯”到

我衷心建议您查看相关问题,并了解如何翻译理解。

 类似资料:
  • 使用 Mercurial 的一个最大好处是, 你可以使用私有本地库来尝试和开发新特性... 如果新特性不管用, 你能在短时间内还原. 失误补救 Mercurial 让你能够尽情尝试. 假设在日常编辑过程中, 你的编辑器发生了异常, 结果你的代码悲剧了: hg revert Note hg revert 将修改的文件恢复到最近一次提交后的状态 非得爱上 emacs 才行吗 (译注: emacs 是

  • 我有两个函数返回期货。我正试图使用for-yield理解将第一个函数的修改结果输入到另一个函数中。 此方法有效: 然而,我对“如果”在那里不满意,似乎我应该能够使用地图。 但是当我尝试使用地图时: 我得到一个编译错误: 我尝试了一些变化,但没有发现任何有吸引力的工作。有人能提出更好的理解和/或解释我的第二个例子的错误吗? 下面是一个最小但完整的Scala 2.10可运行示例:

  • 我试图验证方法的参数是否为空,但我没有找到解决方案。。。 有人可以告诉我该怎么做吗? 我正在尝试这样的事情:

  • 我阅读了一些用C++创建的项目的技术文档。我发现有一行代码包含我不懂的语法: 我看到关键字,这意味着我们处理别名,但这行是做什么的?我怎么能理解呢?我认为这会创建命名别名并将表达式的结果分配给它。但是这个表达是什么呢?

  • 任务是实现递归方法,返回 Future 并且由于这一部分("在其他递归(结果::: res,尝试1)")代码失败与错误,因为它期望未来[Seq[结果]],但实际上返回未来[对象]。 据我所知,问题在于yield块内的表达式必须返回Seq[Result],以便将来由Monad进行后续包装。但是“递归(结果::res,尝试1)”将返回未来。因此,不是预期的Seq[Result]收益率,而是包含未来的[

  • 我阅读了一些用C++创建的项目的技术文档。我发现了一行包含我不懂的语法的代码: 我在这里看到关键字。这意味着我们要处理一个别名,但这行是做什么的?我怎么能理解呢?我认为这会创建一个命名别名并将右边表达式的结果分配给它。但是这个表达是什么呢?