2012-02-04 9 views
8

मुझे प्राथमिक अंतर्निहित मूल्य या निहित रूपांतरण द्वारा मांगी गई अतिरिक्त निहित मूल्यों के बीच व्यवहार में अंतर को समझने में कठिनाई हो रही है। विशेष रूप से, यह काम करता है:स्कैला इस विशेष मामले में द्वितीयक अंतर्निहित मूल्य क्यों नहीं ढूंढ पाता है?

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

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

> implicitly[Int] 
5 

लेकिन यह नहीं करता है:

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] 

परिवर्तनीय:

  • खोज चाहे माध्यमिक निहित द्वारा implicitly या एक अंतर्निहित रूपांतरण
  • शुरू कर दिया गया है या नहीं मूल्य मांगने के बाद polymorphic
  • चाहे माध्यमिक अंतर्निहित मूल्य की आपूर्ति की बहुरूपी है

मैं निम्नलिखित परिणाम प्राप्त:

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 

आप देख सकते हैं, केवल मामले वह काम नहीं करता है जब खोज एक अंतर्निहित रूपांतरण द्वारा शुरू किया गया है, मांग की गई कीमत polymorphic है, फिर भी आपूर्ति आपूर्ति monomorphic है।

क्या कोई सैद्धांतिक कारण है कि यह मामला क्यों होना चाहिए, या यह स्कैला की बग/सीमा है?

उत्तर

7

आपको स्केलैक बग SI-3346 द्वारा काटा जा रहा है। आमतौर पर SI-4699, esp का विवरण देखें। बिंदु (1),

1) अंतर्निहित खोज और निहित रूपांतरण खोज अनिर्धारित प्रकार पैरामीटर अलग ढंग से

जो आप सीधे देख रहे हैं जहाँ आपके मामलों निहित मूल्यों और निहित रूपांतरण के बीच भेद कर रहे हैं का इलाज।

मैंने इसे अतिरिक्त उदाहरण के रूप में शामिल करने के लिए एसआई -3346 अपडेट किया है।

3

बदलें अंतर्निहित रूपांतरण के हस्ताक्षर के बाद जिस तरह से:

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

फिर फोन यानी जिसके लिए एक अंतर्निहित मूल्य परिभाषित किया गया है प्रकार के एक मूल्य, पर aMethod एक स्ट्रिंग साथ:

scala> "foo".aMethod 
res0: Int = 5 
+1

सही उत्तर, गलत प्रश्न ;-) –

संबंधित मुद्दे