2011-08-24 32 views
14

aşağıdaki olduğunu varsayalım. Görebildiğim kadarıyla, bunun sebebi foo ("asdf") nin iyi tanımlanmış bir türe sahip olmamasıdır (Int => Int veya Double => Int).Scala, currying ve aşırı

Böyle "çok amaçlı" işlevlere neden izin verilmemesinin bir nedeni var mı?

+0

https://issues.scala-lang.org/browse/SI-2628 – Bradford

+0

Scala, bu aşırı yüklenme yöntemlerini tanımlamanıza olanak tanır, ancak aşağıdaki çağrı, Martin tarafından aşağıda belirtilen nedenlerden dolayı belirsizdir. İlgili: http://stackoverflow.com/questions/2510108/why-avoid-method-overloading – retronym

cevap

19

Scala'da aşırı yükleme çözünürlüğü yalnızca ilk parametre listesini dikkate alır. Bu yüzden alternatifler bu listede zaten farklı olmalıdır. Bunun için iyi bir neden var: Ardından, çözümlenen işlevin türünü sonraki argüman türlerini bulmak için kullanabiliriz. burada x ve y türlerini anlaması için corresponds türünü bilmek gerekir

xs.corresponds(ys) { (x, y) => x < y } 

Not: Bu gibi deyimler sağlar. corresponds aşırı yüklendiğinde bu kırılmanın olması ayıp olurdu.

+0

Cevabınız için teşekkürler. Bir takip olarak, aşırı yüklerin hangi aşırı yüklenme versiyonlarının kapsama alanına girdiğine bağlı olarak, x ve y'ye atanabilecek olası türlerin bir listesini yapmak mümkün olmaz ve sadece sadece ne zaman yapman gerekiyor? Veya bu, statik yazım fikrine karşı mı gider? –

+0

@Martin Odersky http://stackoverflow.com/q/7291168 adresini görebiliyor musunuz? –

+2

Olası türlerin listelerini dikkate alan herhangi bir yaklaşım, tip kontrol sürelerinin üstel patlamasını riskler. Bu yüzden Scala, genellikle tür çıkarım algoritmasında bunu yapmaz. –

2

Bu, ilk kez soruldu: it was asked back in 2009. Ne yazık ki Martin, meselelerin ne olduğunu açıkça belirtmemişti, bunun dışında aşırı yüklenmenin nasıl çalıştığı konusunda oldukça kapsamlı bir teknik değişiklik gerektirecekti. Spesifikasyonlara baktım ve temel meselelerin nerede yattığını bana açık değil, ama her iki durumda da kesin bir cevap vermek için uzmanlıkta yeteri kadar yetenekli değilim.

+1

Bu biraz farklı bir sorundur. Bağlandığınız soruda, yalnızca kendi dönüş türlerinde ('foo (x: Bar): Unit' vs.' foo (x: Bar): farklı olacak iki fonksiyonunuz var: Function1 [Bar => Baz, Unit] Eğer mantığım doğruysa (hala tamamen ikna olmuyorsa)) – Dirk

+0

_issue_'ın neden farklı olduğunu anlamıyorum. Sorunun ortaya konulduğu koşullar farklı olabilir, ancak sorunun aynı olduğunu düşünüyorum. Her türlü manipülasyon denedim ama hata asla değişmez. Aşırı yüklemenin çok erken yapıldığını ya da "x" nin üzerinde önceliği olduğunu okudum. –

+0

Bunun aynı olduğundan emin değilim. Bağlandığınız ölçek probleminde, foo() ve foo() _ farklı olduğundan, iki fonksiyona sahip olmak mantıklı olacaktır, oysaki mevcut durumda, iki olası fooyu ifade etmenin farklı yolları yoktur. _ işlevler. Bunun altında yatan sebep aynı olabilir, ancak ikna olmadım. Bence Dirk'ın da bir anlamı vardı aslında. –