2011-10-11 16 views
12

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 
+2

'Double' başka bir olası bir türüdür. – Jus12

+1

http://stackoverflow.com/questions/3739133/why-does-scala-require-a-return-type-for-recursive-functions/3739174#3739174 – retronym

+2

@ 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

cevap

6

, yani değeri hiçbir zaman kullanılmaz ve yalnızca diğer tüm dalların ortak süpertipe olarak türünü belirlemek mümkün olmalıdır, geri döndü. nesnelerin varlığında daha karmaşık bir hal aldığı şeylerden - aslında foo bir yöntemdir çünkü

Ancak

def foo(i: Int) = if (i > 0) foo(i - 1) + 1 else 0 

Böyle bir durumda İşlemi +foo(i - 1) + 1 türünü bilmek (veya anlamazsın) foo'un ne olduğunu bilmeden. Yani, yine çevrelerde dolaşıyorsunuz.

3

Scala'nın sunduğu özelliklerden çok daha güçlü bir birleştirme algoritmasına ihtiyacınız vardır. Scala, soldan sağa, yukarıdan aşağıya doğru yazmayı yapar. Yani çıkarım böyle biraz gider:

What is the type of expression "if (i > 0) foo(i - 1) + 1 else 0"? 
Unify "foo(i - 1) + 1" and "0" 
What is the type of "foo(i - 1) + 1"? 
What is the type of "foo(i - 1)" 
What is "foo"? 
foo is the current definition, so we don't know it's type 
error 

sen if yaptıysam sizin tersi olurdu:

sanırım
What is the type of expression "if (i <= 0) 0 else foo(i - 1) + 1 "? 
Unify "0" and "foo(i - 1) + 1" 
What is the type of "0"? 
"0" <: Int >: Nothing 
What is the type of "foo(i - 1) + 1"? 
What is the type of "foo(i - 1)" 
What is "foo"? 
foo is the current definition, so we don't know it's type 
error 
+0

Scala derleyicisinin türlerini nasıl kullandığı hakkında iyi bir açıklama. – Jus12

İlgili konular