gpt4 book ai didi

Scala for ( ) vs for { }

转载 作者:行者123 更新时间:2023-12-04 10:37:35 25 4
gpt4 key购买 nike

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

我很难弄清楚的一件事是 for () 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 类(class)。教授没有在视频中提到“为什么”,我想知道是否有其他人知道。

谢谢!

最佳答案

从规范中的语法来看,括号和大括号似乎可以互换:

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

之前看过并理解了那一段,从中我隐约记得大括号中启用换行符的要点,也就是说,换行符取为nl用作 semi .

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

这是通常的“分号推断”,它允许您不将分号写为语句终止符。所以生成器中间的换行符不作为半,例如:

scala> for (c <-
| List(1,2,3)
| ) yield c+1
res0: List[Int] = List(2, 3, 4)

scala> for { c <-
| List(1,2,3)
| i = c+1
| } yield i
res1: List[Int] = List(2, 3, 4)

关于Scala for ( ) vs for { },我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26686156/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com