Scala derleyici şu anda yukarıda belirtilen açıklamada herhangi ambuigity var mıdır aşağıdaki kodlaScala derleyicisini, özyinelemeli yöntemlerin dönüş türlerini bulmak için genişletmek mümkün mü?
def foo(i:Int) = if (i > 0) foo (i-1) else 0
gibi özyinelemeli yöntemlerin dönüş türleri tahmin edemediği? (yani, Int
'dan başka bir tür olabilir?)
Daha karmaşık bir örnekte, türden çıkmanın zor olacağını hayal edebiliyorum.
Türleri anlayabileceğimiz (değil) özyinelemeli yöntemlerin durumlarını daha fazla karakterize etmek mümkün mü?
[EDIT:] Derleyici, String
'un yanlış olduğunu anlamaya yetecek kadar akıllıdır. senin özyinelemeli çağrı son konumda her zaman ise
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' başka bir olası bir türüdür. – Jus12
http://stackoverflow.com/questions/3739133/why-does-scala-require-a-return-type-for-recursive-functions/3739174#3739174 – retronym
@ Jus12 'foo: Double' olduğu gibi mümkündür f = 2' yi 'Double' olarak tanımlamak mümkündür. Ancak, derleyici 'f = 2' nin bir': Int' olmasını sağlar. Mantıklı bir özyinelemeli tür çıkarsacı, örneğinizde aynı nedenden dolayı foo: Double'i varsaymayacaktır. – Debilski