Il compilatore Scala attualmente non può dedurre i tipi di metodi ricorsivi come nel codice seguenteÈ possibile estendere il compilatore Scala per dedurre i tipi di ritorno dei metodi ricorsivi?
def foo(i:Int) = if (i > 0) foo (i-1) else 0
tornare C'è ambuigity nella dichiarazione di cui sopra? (cioè, è possibile qualsiasi altro tipo oltre allo Int
?)
Posso immaginare che in un esempio più complesso, sarà difficile dedurne il tipo.
È possibile caratterizzare ulteriormente i casi di metodi ricorsivi in cui possiamo (non) dedurre i tipi?
[EDIT:] Il compilatore è abbastanza intelligente da capire che String
non è corretto.
scala> def foo(i:Int):String = if (i > 0) foo (i-1) else 0
<console>:5: error: type mismatch;
found : Int(0)
required: String
Credo 'Double' è un altro tipo possibile. – Jus12
http://stackoverflow.com/questions/3739133/why-does-scala-require-a-return-type-for-recursive-functions/3739174#3739174 – retronym
@ Jus12 'foo: Double' è possibile proprio come è possibile dichiarare 'def f = 2' come': Double'. Tuttavia, il compilatore deduce che 'def f = 2' sia un': Int'. Un inferrer di tipo ricorsivo sensibile non assumerebbe 'foo: Double' per la stessa ragione nel tuo esempio. – Debilski