8

आंशिक कार्यों के लिए स्ट्रिंग का नक्शा बनाते समय मैं अप्रत्याशित व्यवहार में भाग गया। जब मैं नक्शा तत्व के रूप में आंशिक कार्य करता हूं तो यह ठीक काम करता है। जब मैं एक वैल आवंटित करता हूं तो यह इसके बजाय आमंत्रित करता है। चेक का आह्वान करने का प्रयास करने से एक त्रुटि उत्पन्न होती है। क्या यह उम्मीद है? क्या मैं कुछ गूंगा कर रहा हूँ? आमंत्रण देखने के लिए check() पर टिप्पणी करें। मैं स्केला 2.7.7स्केल आंशिक फ़ंक्शन कब आंशिक फ़ंक्शन नहीं होता है?

def PartialFunctionProblem() = { 
    def dream()() = { 
     println("~Dream~"); 
     new Exception().printStackTrace() 
    } 
    val map = scala.collection.mutable.HashMap[String,()=>Unit]() 
    map("dream") = dream()  // partial function 
    map("dream")()    // invokes as expected 
    val check = dream()   // unexpected invocation 
    check()      // error: check of type Unit does not take parameters 
} 
+0

सहायता के लिए धन्यवाद। जब मैंने सपनों() _ के साथ अपने सपने() कॉल को प्रतिस्थापित किया, तो जैसा कि मैंने उम्मीद की थी। मैं बाहर जाउंगा और आंशिक कार्यों पर और अधिक पढ़ूंगा इसलिए मैं इस शब्द को दोबारा दुरुपयोग नहीं करता हूं। –

उत्तर

12

उपयोग कर रहा हूँ सुविधा के लिए, स्काला आप खाली कोष्ठक जब एक विधि बुला छोड़ देता है, लेकिन यह पर्याप्त चतुर को देखने के लिए कि पहले मामले में अपेक्षित प्रकार ()=>Unit है है, तो ऐसा नहीं होता आपके लिए सभी माता-पिता को हटा दें; इसके बजाय, यह विधि आपके लिए एक फ़ंक्शन में परिवर्तित करता है।

val check मामले में, हालांकि, यह एक चर कॉल कॉल परिणाम की तरह दिखता है जैसे एक चर को आवंटित किया जा रहा है।

val check = dream 
val check = dream() 
val check = dream()() 

आप एक समारोह में विधि चालू करना चाहते हैं, तो आप तर्क सूची (रों) के स्थान पर विधि के बाद _ जगह: वास्तव में, इन तीनों को बिल्कुल वही चीज़ करते। इस प्रकार,

val check = dream() _ 

जो भी आप चाहते हैं वह करेंगे।

5

ठीक है, समस्या यह है कि आपको यह सब गलत मिला। :-)

यहाँ कुछ वैचारिक गलतियों हैं:

def dream()() = { 
    println("~Dream~"); 
    new Exception().printStackTrace() 
} 

यह एक आंशिक कार्य नहीं है। यह एक खाली विधि है जिसमें दो रिक्त पैरामीटर सूचियां हैं जो Unit लौटाती हैं।

val map = scala.collection.mutable.HashMap[String,()=>Unit]() 

इस मानचित्र में मानों का प्रकार आंशिक कार्य नहीं है, लेकिन कार्य करता है। विशेष रूप से, Function0[Unit]। आंशिक समारोह में PartialFunction[T, R] होगा।

map("dream") = dream()  // partial function 

यहाँ क्या होता है कि स्काला एक समारोह में धर्मान्तरित आंशिक रूप से लागू किया जाता है। यह एक साधारण असाइनमेंट नहीं है। स्कैला रूपांतरण करता है क्योंकि टाइप इनफ्रेंसर सही प्रकार का अनुमान लगा सकता है।

val check = dream()   // unexpected invocation 

यहां टाइप इनफ्रेंसर की मदद करने के लिए कोई अपेक्षित प्रकार नहीं है। हालांकि, खाली पैरामीटर सूचियों को हटाया जा सकता है, इसलिए यह सिर्फ एक विधि कॉल है।