Scala for()vs for {}

时间:2014-11-01 04:27:01

标签: scala

我试图理解Scala中的理解,我有很多我理解的例子......

我很难搞清楚的是()vs for {}。我已经尝试了两种方式,似乎我可以在一种情况下完成一件事,但在另一件事情上却打破了。

例如,这不起作用:

def encode(number: String): Set[List[String]] =
  if (number.isEmpty) Set(List())
  else {
    for (
      split <- 1 to number.length
      word <- wordsForNum(number take split)
      rest <- encode(number drop split)
    ) yield word :: rest
  }.toSet

但是,如果将其更改为{},则会编译:

def encode(number: String): Set[List[String]] =
  if (number.isEmpty) Set(List())
  else {
    for {
      split <- 1 to number.length
      word <- wordsForNum(number take split)
      rest <- encode(number drop split)
    } yield word :: rest
  }.toSet                                 

这些例子来自Coursera课程。教授没有提到&#34;为什么&#34;在视频和&amp;我想知道是否有其他人知道。

谢谢!

2 个答案:

答案 0 :(得分:8)

根据规范中的语法,似乎parens和braces可以互换:

http://www.scala-lang.org/files/archive/spec/2.11/06-expressions.html#for-comprehensions-and-for-loops

但由于发电机被半成品分开,因此遵循以下规则:

http://www.scala-lang.org/files/archive/spec/2.11/01-lexical-syntax.html#newline-characters

我已阅读并理解过去的这一部分,我隐约回想起在括号中启用换行符的要点,也就是说,换行符char被视为nl作为{{ {1}}。

因此,您可以将生成器放在单独的行上,而不是使用分号。

这是通常的&#34;分号推断&#34;这让你不用分号作为语句终结符。因此,生成器中间的换行符不会被视为半换行符,例如:

semi

答案 1 :(得分:4)

Scala()通常适用于只有一个语句的情况。这样的事情会奏效:

def encode(number: String): Set[Int] =
  if (number.isEmpty) Set()
  else {
    for (
      split <- 1 to number.length // Only one statement in the comprehension
    ) split
  }.toSet

再添加一个,它将无法编译。地图例如

也是如此

List(1,2,3).map(number =>
  number.toString
)

不行(必须使用大括号)

List(1,2,3).map(number =>
  println("Hello world")
  number.toString
)

为什么会这样。我不知道:))