scala关键字优先级

时间:2011-02-19 13:24:42

标签: scala pattern-matching yield

如何在scala中定义“关键字优先级”?

考虑这段代码:

for(i <- 1 to 10) yield i

这没关系,我从1到10得到Seq,但是当我尝试在之后匹配时:

for(i <- 1 to 10) yield i match {case x => x.head}

存在编译错误:error: value head is not a member of Int

我可以在括号中包围for ... yield以使其优先:

{for(i <- 1 to 10) yield i} match {case x => x.head}

但我仍然想知道第二个示例代码是如何解释的。我希望第二个例子能够正常工作,而不用parens包围它。

任何人都可以向我解释或指出我在规范中的正确章节吗?

1 个答案:

答案 0 :(得分:4)

第二个例子被解释为:

for(i <- 1 to 10) yield { i match {case x => x.head} } // won't compile

for 的近似语法如下:

for (Enumerators) yield Expr

由于i match { case x => x.head }解析为有效表达式(标记为明智),因此编译器将看到它。因此,如果 Expr 看起来像一个表达式,那就是它的处理方式。根据这一推理,以下陈述是有效的:

for(i <- 1 to 10) yield for(j <- 1 to 2) yield (i, j)
for(i <- 1 to 10) yield if (i % 2 == 0) 'a' else 'b'
for(i <- 1 to 10) yield try { 1 / (i - 5) } catch { case _ => }

并且它们都等同于

for(i <- 1 to 10) yield { for(j <- 1 to 2) yield (i, j) }
for(i <- 1 to 10) yield { if (i % 2 == 0) 'a' else 'b' }
for(i <- 1 to 10) yield { try { 1 / (i - 5) } catch { case _ => } }

注意:Scala语言规范可用here(第一个链接)。相关部分位于A章(Scala语法摘要)中的第161页。