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

Scala中用于理解的补救语法问题,scala,list-comprehension,Scala,List Comprehension,我在Scala 2.10中遇到了语法问题,无法理解 for(a我最近已经解释了这一点——希望有人能找到链接。这是一个反复出现的问题,所以很可能会被关闭 无论如何,外部生成器控制表示。这在每个级别上都会发生,因此如果我有: for { a <- A b <- B c <- C } yield f(a, b, c) 用于{ aDaniel解释了这一点的复杂性。但我想补充一些细节,因为我发现这种行为非常不直观,我自己也曾遇到过将选项和列表混合在一起的问题。这尤其令人讨

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


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

无论如何,外部生成器控制表示。这在每个级别上都会发生,因此如果我有:

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

aDaniel解释了这一点的复杂性。但我想补充一些细节,因为我发现这种行为非常不直观,我自己也曾遇到过将
选项
列表
混合在一起的问题。这尤其令人讨厌,因为正如你所看到的,它在一个方向工作,而不是在另一个方向

因此,根据理解规则,你将

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))
                                                           ^
或使用
返回以查看

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

for(可能是重复的,也是重复的,谢谢Daniel)。如果问题是重复的,我不会感到惊讶,因为很难搜索,而且关于理解的“Scala之旅”文档没有解释这种行为。真正让我绊倒的是(a@DanielSchobel好吧,在没有
收益率的情况下,你不会返回任何东西,所以没有问题。因为你不能有
一些(1,2)
,你不可能拥有
屈服
版本。我对这项工作投了赞成票,我同意,它似乎应该以其原始形式工作,特别是我在给丹尼尔的评论中指出,对于(a
for(a <- Some(List(1,2)).toIterable; b <- a) yield b