Scala函数返回行为

Scala函数返回行为,scala,recursion,Scala,Recursion,我试图解决这个epfl scala课程的家庭作业,他们让我写一个列表的总和。如果我使用return语句或if-use-match语句,我就可以这样做,但我不明白为什么在没有return语句的情况下使用if/else不能工作 def sum(xs: List[Int]): Int = xs { if (xs.isEmpty) { 0 } else { xs.head + sum(xs.tail) } } 运行sum(列表(1,3,2))时得到的运行时错误为 如果我将代

我试图解决这个epfl scala课程的家庭作业,他们让我写一个列表的总和。如果我使用return语句或if-use-match语句,我就可以这样做,但我不明白为什么在没有return语句的情况下使用if/else不能工作

def sum(xs: List[Int]): Int = xs {
  if (xs.isEmpty) {
    0
  } else {
    xs.head + sum(xs.tail)
  }
}
运行sum(列表(1,3,2))时得到的运行时错误为

如果我将代码中的0替换为100,则错误消息将更改为java.lang.IndexOutOfBoundsException:100。就像它试图访问列表中的第N个元素,而我所需要的只是一个返回。如果我添加两个return语句,则所有语句都会按预期工作


你能解释一下吗?

根本原因在函数声明的第一行:

def sum(xs: List[Int]): Int = xs {
这相当于:

def sum(xs: List[Int]): Int = xs.apply(<Some function>) 
现在:


尝试删除函数开头的
=
之后的
xs
。因此,如果方法的整个主体是单个表达式,则无需创建语句块。把卷曲的大括号丢了。这同样适用于条件表达式:
defsum(xs:List[Int]):Int=if(xs.isEmpty)0 else xs.head+sum(xs.tail)
def sum(xs: List[Int]): Int = xs.apply(<Some function>) 
def sum(xs: List[Int]): Int = {
sum(List(1,3,2))
res0: Int = 6