Sunday, 15 April 2012

Scala overloaded higher-order functions cause type error -


मेरे पास एक अतिभारित विधि है जो निम्न प्रकार से परिभाषित है:

  def g (f: () एक डबल): ऑब्जेक्ट = रिक्त डीआरएफ जी (एफ: डबल डबल डबल): ऑब्जेक्ट = रिक्त डीआरएफ जी (एफ: (डबल, डबल) डबल): ऑब्जेक्ट = रिक डीईएफ एच (एफ: (डबल, डबल) डबल): ऑब्जेक्ट = रिक्त   

जबकि h (math.max _) अपेक्षित रूप से कार्य करता है, कॉलिंग जी (math.max _) मुझे त्रुटि देता है "ओवरलोडेड विधि ... को ((Int, Int) = & gt; Int) पर लागू नहीं किया जा सकता"। ऐसा लगता है कि कंपाइलर ने डबल संस्करण के बजाय math.max का Int संस्करण चुना है।

मैं अपने अधिभारित विधि g को गणित के साथ कैसे कॉल कर सकता हूं एक पैरामीटर के रूप में। यह एक अतिरिक्त बोनस होगा अगर मैं सिर्फ अंडरस्कोर के बिना g (math.max) कॉल कर सकता हूं।

आप कम्पाइलर द्वारा प्रयुक्त किए गए एक अनुमान में चलाए गए हैं ताकि प्रकारों के लिए शीघ्रता से जटिल खोजों से बचने में सहायता मिल सके। जब विधि अतिभारित होती है, तो यह तर्क के प्रकार के आधार पर अव्यवस्थित करने की कोशिश करता है। दुर्भाग्य से, तर्क भी भी अतिभारित है।

आप इसे सही तरीके से पूछकर और खोज कर सकते हैं:

  g (math.max (_, _))   

नोटिफिकेशन से यह अब संकलक को स्पष्ट है कि वह Function2 की तलाश में है और यहां तक ​​कि - यहां तक ​​कि हालांकि अधिकतम के सभी संस्करणों को Function2 होना चाहिए - एक मैच की खोज करने के लिए संकलक को प्राप्त करने के लिए पर्याप्त है (और यह डबल से < कोड> डबल करें )।

No comments:

Post a Comment