我正在编辑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
}
答案 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
。