2012-06-04 9 views
7

currying multi parameter-groups method is possible की खोज के बाद, मैं आंशिक रूप से लागू फ़ंक्शन प्राप्त करने की कोशिश कर रहा हूं जिसके लिए निहित पैरामीटर की आवश्यकता है।स्कैला, अंतर्निहित पैरा सहित बहु पैरामीटर-समूह विधि पर करीना?

यह ऐसा करने के लिए संभव नहीं है। यदि आप मुझे समझा नहीं सकते क्यों?

scala> def sum(a: Int)(implicit b: Int): Int = { a+b } 
sum: (a: Int)(implicit b: Int)Int 

scala> sum(3)(4) 
res12: Int = 7 

scala> val partFunc2 = sum _ 
<console>:8: error: could not find implicit value for parameter b: Int 
     val partFunc2 = sum _ 
        ^

मैं एक सिंगलटन ऑब्जेक्ट का उपयोग इस आंशिक रूप से लागू किया समारोह बनाने के लिए और मैं एक गुंजाइश जहां अंतर्निहित पूर्णांक परिभाषित किया गया है में उपयोग करना चाहते हैं।

उत्तर

8

ऐसा इसलिए है क्योंकि आपके पास दायरे में अंतर्निहित अंतर नहीं है। देखें:

scala> def foo(x: Int)(implicit y: Int) = x + y 
foo: (x: Int)(implicit y: Int)Int 

scala> foo _ 
<console>:9: error: could not find implicit value for parameter y: Int 
       foo _ 
      ^

scala> implicit val b = 2 
b: Int = 2 

scala> foo _ 
res1: Int => Int = <function1> 

निहित को संकलक द्वारा वास्तविक मूल्य के साथ प्रतिस्थापित किया जाता है। यदि आप विधि को करी करते हैं तो परिणाम एक फ़ंक्शन होता है और फ़ंक्शंस में अंतर्निहित पैरामीटर नहीं हो सकते हैं, इसलिए जब आप विधि को करी करते हैं तो संकलक को मान डालना पड़ता है।

संपादित करें:

object Foo { 
    def partialSum(implicit x: Int) = sum(3)(x) 
} 
+0

धन्यवाद:

आपके उपयोग के मामले के लिए, क्यों आप की तरह कुछ कोशिश मत करो। लेकिन जैसा कि मैंने कहा, मुझे इस फ़ंक्शन को किसी अन्य सिंगलटन ऑब्जेक्ट में घोषित करने की आवश्यकता है। मुझे इसे संदर्भ से बाहर घोषित करने की आवश्यकता है जहां मैं इसका उपयोग करता हूं। – iwalktheline

+0

ने मेरी पोस्ट संपादित की। मुझे लगता है कि ऐसा करने का कोई अन्य तरीका नहीं है, जिन कारणों से मैंने पहले ही उल्लेख किया है। – drexin

+0

आप सही हैं। करी के रूप में फंक्शन और फंक्शन अंतर्निहित पैराम की अनुमति नहीं देता है, मुझे दो समूहों में से एक के पैराम की व्याख्या करने की ज़रूरत है। – iwalktheline

0
scala> object MySingleton { 
| def sum(a: Int)(implicit b: Int): Int = { a+b } 
| 
| 
| def caller(a: Int) = { 
|  implicit val b = 3; // This allows you to define the partial below 
|  def pf = sum _  // and call sum()() without repeating the arg list. 
|  pf.apply(a) 
| } 
| } 
defined module MySingleton 


scala> MySingleton.caller(10) 
res10: Int = 13 
+3

एसओ में आपका स्वागत है! कोड को पोस्ट करने के बजाय, कृपया कुछ अंतर्ज्ञानी स्पष्टीकरण छोड़ने पर विचार करें। – vefthym

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

  • कोई संबंधित समस्या नहीं^_^