scala 关键字优先级

标签 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}

出现编译错误:错误:值头不是 Int 的成员

我可以将 for ... yield 括在括号中以赋予其优先级:

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

但我仍然想知道第二个示例代码是如何解释的。我希望第二个示例也能正常工作,而无需用括号括起来。

有人可以向我解释一下或者指出规范中正确的章节吗?

最佳答案

第二个例子解释为:

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 } 解析为有效表达式( token 方面),因此编译器将如何看待它。因此,如果 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 页。

关于scala 关键字优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5051008/

相关文章:

Python:一个函数中有两个 "yield"

ruby-on-rails - 以任意顺序匹配多个 yield

scala - 如何在Scala中用 map 替换 yield ?

scala - 如何定义DataFrame的分区?

java - 在java中使用正则表达式进行模式搜索

java - 在更大的 2D 数组中查找 2D 数组

string - 执行 Boyer-Moore 模式匹配时是否必须考虑编码?

algorithm - 一个 "while remaining"算法如何转换为函数式?

scala - 读取多个文件并收集是否会将它们带到 Spark 中的驱动程序

scala - Spark : way to join each row of dataframe with all rows of another dataframe