是否可以扩展Scala编译器以推断返回类型的递归方法?

Jus*_*s12 12 scala

Scala编译器当前无法推断递归方法的返回类型,如以下代码所示

def foo(i:Int) = if (i > 0) foo (i-1) else 0
Run Code Online (Sandbox Code Playgroud)

上述声明中是否存在任何矛盾?(即,除了Int可能以外的任何类型?)

我可以想象,在更复杂的例子中,很难推断出类型.

是否有可能进一步描述递归方法的情况,我们可以(不)推断出类型?

[编辑:]编译器足够聪明,可以发现这String是不正确的.

scala> def foo(i:Int):String = if (i > 0) foo (i-1) else 0
<console>:5: error: type mismatch;
found   : Int(0)
required: String
Run Code Online (Sandbox Code Playgroud)

Deb*_*ski 6

如果递归调用始终位于最后一个位置,即它的值从未使用过并且只返回,则应该可以将类型确定为所有其他分支的公共超类型.

但是,在某种情况下

def foo(i: Int) = if (i > 0) foo(i - 1) + 1 else 0
Run Code Online (Sandbox Code Playgroud)

你不会知道foo(i - 1) + 1(或者理解操作的类型,+因为它实际上是一个方法foo- 事物在存在对象时变得越来越复杂)而不知道是什么foo.所以,你又一次在圈子里走来走去.