निम्न कोड पर विचार करें:अंतर्निहित पैरामीटर संकल्प
object foo {
trait Bar[Q[_]]
implicit object OptionBar extends Bar[Option]
def test[T, C[_]](c: C[T])(implicit bar: Bar[C]) =()
def main(args: Array[String]) {
test(Some(42): Option[Int]) //???
}
}
यह काम करता है, लेकिन मैं कुछ (42) के रूप में विकल्प [इंट] है, और अंतर्निहित वस्तु OptionBar नहीं होगा टाइप करने की आवश्यकता हल किया गया (क्योंकि इसके बजाय एक बार [कुछ] की उम्मीद है)। क्या स्पष्ट टाइपिंग से बचने का कोई तरीका है, ताकि मैं परीक्षण में ऑब्जेक्टबार ऑब्जेक्ट प्राप्त कर सकूं, भले ही मैं कुछ या किसी के साथ परीक्षण खिलाऊं?
[स्पष्टीकरण]
- मैं यहाँ विकल्प का इस्तेमाल किया सिर्फ उदाहरण के रूप में, यह भी है कि अगर मैं एक अमूर्त वर्ग आदि के लिए एक
Bar
है - समाधान भी काम करना चाहिए जब अन्य, असंबंधित बार्स हैं काम करना चाहिए दायरे में, कहते हैं कि
implicit object listBar extends Bar[list]
[अपडेट]
ऐसा लगता है कि बार की पैरामीटर contravariant बनाने टी करता है उन्होंने चाल:
object foo {
trait Bar[-Q[_]] //<---------------
implicit object OptionBar extends Bar[Option]
implicit object ListBar extends Bar[List]
def test[T, C[_]](c: C[T])(implicit bar: Bar[C]) =()
def main(args:Array[String]) {
test(Some(42))
}
}
लेकिन निश्चित रूप से इस बार में संभावनाओं की एक गंभीर सीमा है, इसलिए मैं अभी भी एक बेहतर जवाब के लिए उम्मीद है।
गंभीर सीमा का उल्लंघन क्यों होता है? इसका उपयोग किए बिना, बार बार invariant है। यदि आप बार को उच्च प्रकार के प्रकारों के खिलाफ टाइप-क्लास के रूप में उपयोग करने का प्रयास कर रहे हैं जो कि मेरे दिमाग में विपरीत लगता है। यह निश्चित रूप से तब तक है जब तक आप उप-वर्गों का अलग-अलग व्यवहार नहीं करना चाहते। हालांकि, उस मामले में, आपके पास अभी भी अन्य चालें हैं, जैसे कि निहित संकल्प "प्राथमिकताओं" – jsuereth
@ जोश: 'विशेषता बार [क्यू [_]] {डीफ़ शून्य [टी]: क्यू [टी]} जैसे कुछ पर विचार करें, कोई भी नहीं बचा रहा है और मेरे उदाहरणों में नील। लेकिन अगर मैं क्यू को contravariant के रूप में परिभाषित करता हूं, तो मेरे पास बार में ऐसी कोई विधि नहीं हो सकती है। जब आप इसे हल करने के बारे में जानते हैं, तो कृपया मुझे बताएं ... – Landei
इसके अलावा, एक समान रूप से contravariant प्रकार वर्ग के लिए, जैसे 'समान [टी]', निहित खोज 'समान [पशु]' बराबर [कुत्ते] ': http://www.scala-lang.org/node/4626। विरासत और प्रकार के वर्ग एक साथ जाल करने के लिए वास्तव में मुश्किल हैं। – retronym