为什么eclipse抱怨“递归方法循环需要结果类型”?

时间:2016-07-24 12:30:06

标签: scala recursion methods

我正在编辑eclipse中的代码,但它抱怨“递归方法循环需要结果类型”,那么错误是什么?感谢。

package week2

object exercise {
  def factorial(n: Int): Int = {
    def loop(acc: Int, n: Int) =
      if (n == 0) acc
      else loop(acc * n, n - 1)

    loop(1, n)
  }

  factorial(4)
}

感谢您的回答。是的,我在这里错过了什么。正确的是:

package week2

object exercise {
  def factorial(n: Int): Int = {
    def loop(acc: Int, n: Int): Int =
      if (n == 0) acc
      else loop(acc * n, n - 1)

    loop(1, n)
  }                                               //> factorial: (n: Int)Int

  factorial(4)                                    //> res0: Int = 24
}

2 个答案:

答案 0 :(得分:1)

Scala语言的规则,任何递归方法都需要使用返回类型声明。 loop是一个递归方法,你没有为它声明一个返回类型(你只为factorial声明了一个,它不一定需要一个)。因此scalac(以及扩展Eclipse)告诉您递归方法loop需要返回类型。

答案 1 :(得分:1)

正如sepp2k所指出的,它受到编译器的限制。只是想添加更多信息以便澄清。

根据Scala的local type inference机制

  

返回类型的方法通常可以省略,因为它们对应于主体的类型,由编译器推断

考虑非递归函数

def f(n: Int) = n % 2 == 0

编译器可以推断结果类型,因为它知道表达式x % 2 == 0将始终生成类型Boolean

但是当你处理递归函数时,比如

def f(n: Int) = if (n == 0) 1 else n * f(n-1)

Scala编译器不会推断if (x == 0) 1 else x * f(x-1)的结果类型,因为这会导致无限循环。它甚至不知道f(x-1)*操作的合格操作数,因此会给您一个错误Cannot resolve reference * with such signature