2012-01-05 36 views
5

मैं थोड़ा curried और uncurried सामान्य कार्यों के बीच में टाइप-चेकिंग अंतर से उलझन में:जेनेरिक प्रकार एकीकरण: एकाधिक पैरामीटर (टी, टी) बनाम एकाधिक पैरामीटर सूचियां (टी) (टी)?

scala> def x[T](a: T, b: T) = (a == b) 
x: [T](a: T, b: T)Boolean 
scala> def y[T](a: T)(b: T) = (a == b) 
y: [T](a: T)(b: T)Boolean 

मेरे अंतर्ज्ञान था कि दोनों x(1, "one") और y(1)("one") प्रकार त्रुटियों देना चाहिए, लेकिन मैं गलत था:

scala> x(1, "one") 
res71: Boolean = false 
scala> y(1)("one") 
<console>:9: error: type mismatch; 
found : java.lang.String("one") 
required: Int 
       y(1)("one") 
       ^

पहले तो मैंने सोचा था कि वहाँ पर जा रहा अंतर्निहित कास्टिंग के कुछ प्रकार था, लेकिन उस मामले होने लगते नहीं किया:

scala> x(1 :Int, "one" :String) 
res73: Boolean = false 

तो क्या चल रहा है? मेरा अंतर्ज्ञान क्या होना चाहिए?

+0

मैंने इसे बहुत समय पहले एक डुप्लिकेट देखा है। मुझे यह भी विश्वास है कि एसएलएस में यह [लगभग] सटीक मामला दस्तावेज है। –

+0

वहां हम जाते हैं। मैंने शीर्षक "एकाधिक पैरामीटर सूचियों" के साथ शीर्षक को अद्यतन किया है, जिस पर एसएलएस में चर्चा की गई है :) –

उत्तर

9

मुझे लगता है कि पहले मामले में यह दोनों तर्कों जैसे उथल-पुथल (डाउनकास्टिंग?) है कि टी: कोई भी। दूसरे में, यह Int के लिए करी है, और फिर स्ट्रिंग पर विफल रहा है।

यह मैं बाहर सहन करने के लिए लगता है:

scala> y(1)_ 
res1: Int => Boolean = <function1> 
+0

ठीक है, ऐसा लगता है कि 'y (1: Any) (" हैलो ") 'झूठा' देता है। – rampion

+0

इस –

+0

के कुछ और सबूतों के लिए मेरा संपादन देखें एक दिलचस्प साइड-नोट के रूप में, यह प्रश्न यहां दिए गए दावे में कॉल करने लगता है: http://www.scala-lang.org/node/262 कि "फिर f (x) (वाई) और जी (एक्स, वाई) बिल्कुल एक ही कोड में संकलित हैं। " –

10

स्काला एक समय में प्रकार एक पैरामीटर ब्लॉक निर्धारित करने के लिए कोशिश करता है। आप यह देख सकते यदि आप किसी अन्य पैरामीटर जोड़ने और आंशिक रूप से लागू होते हैं: (Any पर और == परिभाषित किया गया है)

def x[T](a: T, b: T)(c: T) = (a == b) 
scala> x(1, "one") _ 
res0: Any => Boolean = <function1> 
बेशक

, दोनों Int और String रहे Any

प्रकार पैरामीटर जो पहले के एक ब्लॉक में इस्तेमाल नहीं कर रहे हैं एक बाद ब्लॉक में इस्तेमाल किया जा करने के लिए स्वतंत्र रहते हैं:

def y[T,U](a: T)(b: U)(c: (T,U)) = (a == b) 
scala> y(1)("one") 
res1: (Int, java.lang.String) => Boolean = <function1> 

आप बाद में भी ब्लॉक में मूलभूत मूल्यों के रूप में पहले ब्लॉक का उपयोग कर सकते हैं!

def z[T,U](a: T)(b: U)(c: (T,U) = (a,b)) = (c._1 == c._2) 
scala> z(1)("one")() 
res2: Boolean = false 

इस प्रकार, कई पैरामीटर ब्लॉक के बीच अपने मापदंडों के वितरण दोनों प्रकार निष्कर्ष के लिए और दोषी के लिए (और आंशिक आवेदन के लिए) परिणाम है।

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