2012-02-04 26 views
8

Birincil örtük değer veya bir örtük dönüştürme tarafından aranan arasındaki ek örtülü değerler arasındaki davranış farkını açıklamakta zorlanıyorum.Scala neden bu özel durumda ikincil bir örtük değer bulamıyor?

trait Foo[A] 
implicit def fooString: Foo[String] = null 

implicit def value[A](implicit foo: Foo[A]) = 5 

> implicitly[Int] 
5 

Ama bu değil: Özellikle, bu işleri

implicit def conversion[A](x: Int)(implicit foo: Foo[A]) = new { 
    def aMethod = 5 
} 

> 1.aMethod 
could not find implicit value for parameter foo: test.Foo[A] 

Değişen: Arama ikincil örtülü olsun implicitly veya örtük bir dönüşüm

  • tarafından başlatılmış olup olmadığı

    • sonra aranan değer polimorfik
    • olup olmadığı verilen ikincil örtülü değeri polimorfik olduğu

    aşağıdaki sonuçlar elde: Gördüğünüz gibi, çalışmıyor tek durum arama örtük bir dönüşüm ile başlatılır edilir

    Conversion/value Searching for Supplied | Works? 
    ---------------- ------------- -------- | ------ 
        conversion  poly   poly | yes 
        conversion  poly   mono | **no** 
        conversion  mono   poly | yes 
        conversion  mono   mono | yes 
        value   poly   poly | yes 
        value   poly   mono | yes 
        value   mono   poly | yes 
        value   mono   mono | yes 
    

    , aranan değer polimorfiktir, ancak sağlanan değeri monomorfiktir.

    Bunun neden olması gerektiği konusunda teorik bir neden var mı, yoksa bu Scala'nın hata/sınırlaması mı?

  • cevap

    7

    Scalac bug SI-3346 tarafından ısırıldınız. Daha genel olarak SI-4699, esp. noktası (1),

    1) örtük arama ve örtük dönüştürme araması vakalar örtük değerler ve örtülü dönüşümler arasında ayrım nerede doğrudan gözlemliyoruz belirlenemeyen tip parametreleri farklı

    davranın.

    Bunu ek bir örnek olarak eklemek için SI-3346'yı güncelleştirdim.

    3

    değiştirme örtük dönüştürme imzası aşağıdaki yol:

    :

    implicit def conversion[A](a: A)(implicit foo: Foo[A]) = new { 
    

    sonra çağrı bir dize ile örtülü bir değer tarif edildiği tipte bir değere, yani ilgili aMethod

    +1

    Doğru cevap, yanlış soru ;-) –

    İlgili konular