gpt4 book ai didi

scala - 为什么这段代码需要空行或分号?

转载 作者:行者123 更新时间:2023-12-02 13:45:09 25 4
gpt4 key购买 nike

case class MyInt(val i : Int) {
private def factorial(a : Int) : Int = a match {
case 0 => 1
case n => (n) * factorial(n-1)
}
def ! = factorial(i)
override def toString = i.toString
}

object MyInt {
implicit def intToMyInt(x : Int) = MyInt(x)
implicit def myIntToInt(x : MyInt) = x.i
}
import MyInt._

object Factorial {
def main(args: Array[String]): Unit = {
val a = 5
val aFact = a!
println("factorial of " + a + " is " + aFact)

}
}

如果我在 println 之前没有放置分号或空行,则无法编译:

recursive value aFact needs type

最佳答案

所有关于递归函数和类型的讨论都是转移注意力的。 Scala 的语法不允许在表达式末尾以外的任何其他位置使用后缀运算符。这就是我们所说的语法:没有任何语义的事物的语法。以下是规范中的相关语法:

Expr        ::= (Bindings | [‘implicit’] id | ‘_’) ‘=>’ Expr
| Expr1
Expr1 ::= ‘if’ ‘(’ Expr ‘)’ {nl} Expr [[semi] else Expr]
| ‘while’ ‘(’ Expr ‘)’ {nl} Expr
| ‘try’ ‘{’ Block ‘}’ [‘catch’ ‘{’ CaseClauses ‘}’]
[‘finally’ Expr]
| ‘do’ Expr [semi] ‘while’ ‘(’ Expr ’)’
| ‘for’ (‘(’ Enumerators ‘)’ | ‘{’ Enumerators ‘}’)
| {nl} [‘yield’] Expr
| ‘throw’ Expr
| ‘return’ [Expr]
| [SimpleExpr ‘.’] id ‘=’ Expr
| SimpleExpr1 ArgumentExprs ‘=’ Expr
| PostfixExpr
| PostfixExpr Ascription
| PostfixExpr ‘match’ ‘{’ CaseClauses ‘}’
PostfixExpr ::= InfixExpr [id [nl]]

PostfixExpr 出现在它们旁边的唯一两个位置是 case 语句中的 if 之后和 之前:_* 在参数列表上。因此,从这个角度来看,我们发现后缀表达式的方法名称右侧唯一可以出现的内容是类型归属或匹配

那么,什么结束表达式呢?嗯,表达式出现在语法中的很多地方,所以有很多东西可以结束它。在此特定示例中,表达式是 Block 内的 BlockStat,因此它必须以分号结尾,分号可能会被推断出来,也可能不会被推断出来。

要推断这个分号,下一行必须不能是可以解析为另一种表达式的内容。在这种特殊情况下,我们有这样的:

    val aFact = a!
println("factorial of " + a + " is " + aFact)

现在,让我们从编译器的角度重写它:

    val id = id id
id ( stringLit id id id stringLit id id )

这些文字和标识符的解析如下:

    val id = id id id ( expr )
val Pattern2 = SimpleExpr1 id SimpleExpr1 ArgumentExprs
val Pattern2 = InfixExpr
val Pattern2 = Expr
val PatDef
PatVarDef
Def
BlockStat

因此,当编译器解析您的程序时,这看起来像是一个有效的中缀表达式。后来,它注意到类型不匹配,但现在回去看看是否可以推断出分号已经太晚了。

关于scala - 为什么这段代码需要空行或分号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3735329/

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