2012-09-30 11 views
10

मान लीजिए मैं 2 पैरामीटर है कि मैं आंशिक रूप से लागू करने की आवश्यकता का एक समारोह है, मैं के रूप में यह निर्धारित करने होंगे:स्कैला में करीकरण करने से एकाधिक पैरामीटर सूचियों की आवश्यकता क्यों होती है?

def f(a: Int)(b: Int) = { /* some code */ } 

और फिर मैं यह आंशिक रूप से def fWithA = f(a) _

मेरा प्रश्न के रूप में आवेदन कर सकते हैं है: आदेश में फ़ंक्शन को करी करने के लिए स्कैला की आवश्यकता क्यों होती है कि पैरामीटर एकाधिक पैरामीटर सूचियों का उपयोग करके घोषित किए जाते हैं? वांछित के रूप में किसी भी समारोह को करी करने में सक्षम होना बेहतर होगा।

उत्तर

15

कुछ कारणों से 'वास्तविक' करी के लिए स्कैला में कई पैरामीटर सूचियों की आवश्यकता होती है:

  • ओवरलोडिंग। पूरी तरह से कार्यात्मक भाषाओं के विपरीत, स्कैला में आप विधियों को अधिभारित कर सकते हैं। यदि आप आंशिक रूप से फ़ंक्शन को लागू करते हैं, तो संकलक आपके द्वारा अधिभारित अधिभार को अलग करने में सक्षम नहीं हो सकता है। विनिर्देशन पहली पैरामीटर सूची में ओवरलोडिंग रिज़ॉल्यूशन को सीमित करता है।

  • त्रुटि संदेश। "विधि कॉल के लिए पर्याप्त तर्क नहीं" त्रुटि संदेश बहुत उपयोगी (और समझने में आसान) है। अगर किसी को किसी विधि के लिए करी करने की इजाजत दी जाती है, तो त्रुटि संदेश "आवश्यक:" "कुछ तीरों के साथ कुछ फ़ंक्शन प्रकार" प्रकार

  • प्रदर्शन। JVM पर चलने से यह विधियों को कॉल करने में बहुत सक्षम बनाता है, जबकि कार्य (चल रहा है) एक इंटरफ़ेस कॉल के माध्यम से) धीमे हैं।

24

असल में आप आंशिक रूप से किसी भी विधि को लागू कर सकते हैं। सीधे शब्दों में विधि कॉल और पैरामीटर बाहर छोड़:

scala> def foo(a: Int, b: Int) = a*b 
foo: (a: Int, b: Int)Int 

scala> val x = foo(1,_: Int) 
x: Int => Int = <function1> 

scala> def bar(x: Int, y: Int, z: Int) = x*y+z 
bar: (x: Int, y: Int, z: Int)Int 

scala> bar(2,_:Int,6) 
res0: Int => Int = <function1> 

फर्क सिर्फ इतना है, तो आप, संकलक लापता तर्क के प्रकार बताने के लिए है, क्योंकि अन्यथा यह अतिभारित तरीकों के बीच तय नहीं कर सका है।

एक और तरीका है, यदि आप एक असली समारोह और नहीं है एक विधि समारोह पर curried कॉल करने के लिए होगा:

scala> val f = {(x:Int, y:Int) => x*y} 
f: (Int, Int) => Int = <function2> 

scala> f.curried 
res2: Int => (Int => Int) = <function1> 

और तुम भी _ के साथ एक विधि से एक समारोह बना सकते हैं:

scala> bar _ 
res6: (Int, Int, Int) => Int = <function3> 

और फिर उस पर curried फोन:

scala> (bar _).curried 
res5: Int => (Int => (Int => Int)) = <function1> 
+0

किसी भी प्रकार के फ़ंक्शन को क्यूर करने के तरीके पर यह युक्ति उपयोगी होगी। धन्यवाद :) – pramodbiligiri

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

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