Bu sorun yazdığım bir modülde ortaya çıktı, ancak aynı davranışı sergileyen minimal bir durum yaptım.Neden çıkarım yazmıyorsunuz?
class Minimal[T](x : T) {
def doSomething = x
}
object Sugar {
type S[T] = { def doSomething : T }
def apply[T, X <: S[T]] (x: X) = x.doSomething
}
object Error {
val a = new Minimal(4)
Sugar(a) // error: inferred [Nothing, Minimal[Int]] does not fit the bounds of apply
Sugar[Int, Minimal[Int]](a) // works as expected
}
sorun derleyici Minimal
(Int
) için iç parametre anlamaya yönetir olduğunu, ama açıktır ki apply
eşleşmeyen Nothing
için T
diğer oluşumu, ayarlar. Bunlar, ilk parametrenin kaldırılması, T'nin tanımlanmadığı gibi ikinci bir şikayette bulunduğundan, kesinlikle T
aynıdır.
Derleyici, ilk parametreyi bulamadığı veya bu bir hata mı olduğu anlamına gelen bazı belirsizlik var mı? Bu incelikle çalışabilir miyim?
Ek bilgi: Bu kod sözdizimsel şeker girişiminin basit bir örneğidir. Orijinal kod, a
modülünü |(a)|
yapmak için dener; burada a, bir vektördür. Açıkça |(a)|
, |[Float,Vector3[Float]](a)|
'u yazmaktan daha iyidir, ancak maalesef bunu daha kolay hale getirmek için unary_|
kullanamıyorum.
gerçek hata: yapı tipi üzerinde sınırları ile bir tuhaflık var
inferred type arguments [Nothing,Minimal[Int]] do not conform to method apply's type parameter bounds [T,X <: Sugar.S[T]]
Evet, bu çözüm benim durumumda iyi çalışıyor. Aynı zamanda Joshua'nın çözümünden de daha temizdir (üzgünüm Yeşim!). Joshua'nın çözümünün neden işe yarayacağını anlatabilir misin? – Dylan
Joshua'nın çözümünün neden işe yarayıp yaramadığına dair bir açıklama vermek üzere güncellendi. –