Scalaのコンパイラは、現在、以下のコードScalaコンパイラを拡張して、戻り型の再帰メソッドを推測することはできますか?
def foo(i:Int) = if (i > 0) foo (i-1) else 0
のように再帰的なメソッドの戻り値の型を推論することはできません上記の文のいずれかのambuigityはありますか? (すなわち、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
http://stackoverflow.com/questions/3739133/why-does-scala-require-a-return-type-for-recursive-functions/3739174#3739174 – retronym
@ Jus12 'foo:Double 'はそのままで可能です'def f = 2'を':Double'として宣言することができます。しかし、コンパイラは 'def f = 2'を':Int'と推論します。分かりやすい再帰型推論器はあなたの例と同じ理由で 'foo:Double'を仮定しません。 – Debilski