【发布时间】:2011-10-11 18:57:32
【问题描述】:
Scala 编译器目前无法推断递归方法的返回类型,如下代码所示
def foo(i:Int) = if (i > 0) foo (i-1) else 0
上述说法有歧义吗? (即,除了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
【问题讨论】:
-
我猜
Double是另一种可能的类型。 -
@Jus12
foo: Double是可能的,就像将def f = 2声明为: Double一样。然而,编译器将def f = 2推断为: Int。出于与您的示例相同的原因,合理的递归类型推断器不会假定foo: Double。
标签: scala