在表达式的Scala中,Yield语法明显不一致?

时间:2013-02-20 06:47:38

标签: scala

我正在尝试学习scala,我正在努力理解为什么以下是合法的:

for (idx <- 1 to 10) yield idx

但以下内容不合法。

for (idx <- 1 to 10) { yield idx }

他们在语法上看起来是一样的。我错过了什么?

提前致谢。

3 个答案:

答案 0 :(得分:9)

因为这是解析器的工作方式,所以这里是Scala specification的部分:

Expr1 ::= ‘for’ (‘(’ Enumerators ‘)’ | ‘{’ Enumerators ‘}’)
  {nl} [‘yield’] Expr

它说我们可以拥有一个或多个如此命名的枚举器,{nl}说我们可以嵌套多个for,如

for(...)
  for(...) 
    ...

我们可以添加可选的yield关键字,后跟表达式,但没有大括号的位置。它本身的表达式(正文)可以是(idx){idx},只是idx或其他内容,所以这是合法的:

for (idx <- 1 to 10) yield { idx }

答案 1 :(得分:1)

这归结为for-expression如何去糖(以及与之相关的解析器规则)。

在第一种情况下,编译器会将理解解除以下内容:

(1 to 10).map(idx => idx)

第二种情况是允许人们使用for循环的简写(这可能很麻烦)。 for的第二种形式实际上是foreach,其结果始终是Unit,因此yield是不可能的,因为已经定义了返回类型。

答案 2 :(得分:1)

yield似乎可以将其替换为map。 因此,这可能

for (idx <- 1 to 10) yield {val square = idx * idx; square}

您可以在scala-yield-syntax找到更多详情,并在此处详细了解can-someone-explain-scalas-yield