2016-01-17 3 views
7

नीचे वर्णित अनुसार मेरे स्कैला 2.11.7 प्रतिकृति में foo(1) पर कॉल क्यों करता है?क्यों फू [एफ [_], ए] (एफएफ: एफ [ए]) foo (1) स्वीकार करते हैं?

scala> def foo[F[_], A](fa: F[A]) = null 
foo: [F[_], A](fa: F[A])Null 

scala> foo(List(1)) 
res0: Null = null 

scala> foo(1) 
res1: Null = null 

foo(1) करने के लिए अपने कॉल में पैरामीटर एक प्रकार निर्माता तो क्यों स्काला repl यह स्वीकार नहीं करता है?

उत्तर

3

आपका Int, और कक्षा Any स्काला में प्रकार का एक प्रकार निर्माता माना जाता है (क्योंकि एक प्रकार निर्माता और इतने प्रकार पदानुक्रम एक महाप्रकार भी एक प्रकार निर्माता है कि खोजने के लिए विश्लेषण किया जाता है नहीं है) वर्ग Any का एक उदाहरण माना जाता है Nothing

आप नीचे दिए गए कोड के साथ इस व्यवहार की जाँच कर सकते हैं:

import scala.reflect.runtime.universe._ 

object Main { 
    def foo[F[_], A](fa: F[A])(implicit ev: TypeTag[F[A]], ev2: TypeTag[A]) = { 
    println(ev) 
    println(ev2) 
    println(ev.tpe.typeArgs) 
    println() 
    null 
    } 

    def main(args: Array[String]){ 
    foo(List(1)) 
    foo(1) 
    } 
} 

आउटपुट:

TypeTag[List[Int]] 
TypeTag[Int] 
List(Int) 

TypeTag[Any] 
TypeTag[Nothing] 
List() 
+0

स्थिति भी बहुत कुछ अजीब है। केस ऑब्जेक्ट ए; foo (ए) 'काम नहीं करता है। यदि समस्या आपके द्वारा वर्णित 'कोई भी' थी - तो यह काम करता। इसके अलावा 'Predef' में 'एरोएएसएस' जैसी कुछ अंतर्निहित रूपांतरण हैं, जो वास्तव में 'एफ [_]' होने में योगदान दे सकते हैं, लेकिन अन्य भी हैं। इसलिए मैं इस त्रुटि का आकलन करता हूं कि इसमें अस्पष्ट अंतर्निहित रूपांतरण हैं, लेकिन यह नहीं है और यह 'Int' स्वीकार करता है, लेकिन' ऑब्जेक्ट ए 'नहीं। इसके अलावा मैंने एक बहुत ही समान कोड के साथ संदिग्ध अंतर्निहित रूपांतरण त्रुटि देखी है, लेकिन दुर्भाग्य से – Archeg

+0

दुर्भाग्य से इसे पुन: उत्पन्न नहीं कर सकता है जब मेरे पास कुछ खाली समय होता है तो मैं ऑब्जेक्ट रूपांतरण में देखता हूं। –

+0

इसलिए, यदि मैं 'foo' को 'def foo [F [_], ए] (fa1: F [A], fa2: F [A]) के रूप में परिभाषित करता हूं और फिर' foo (1," हैलो ") को कॉल करता हूं, , यह एक कानूनी कॉल है क्योंकि '1' और' "हैलो" दोनों प्रकार के टाइप-कन्स्ट्रक्टर हैं 'Any'? – rodoherty1

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