2016-06-26 15 views
5

तोड़ता है मैं हमेशा मानता हूं कि टाइप किए गए उपनाम हमेशा आवश्यक होने पर उनके मूल प्रकार में विस्तारित होते हैं। लेकिन, यहां एक उपद्रवीस्कैला प्रकार एलियासिंग प्रकार संगतता

def a[P](a: Option[P]) = { 
    type Res = List[P] // result type alias 
    Nil: Res // Replace this line with Nil: List[P] to clear the error 
} 
def b[V](v: V) = a(Some(v)): List[V] 

इसके साथ (scastie)

error: type mismatch; 
found : Res (which expands to) List[P] 
required: List[V] 

आप देखते हैं कि aOption[P] => List[P] धर्मान्तरित और b आपूर्ति Some[V], a धर्मान्तरित Option[V] => List[V] जब b यह कहता है के बाद से, विफल रहता है। लेकिन, कंपाइलर का कहना है कि परिणाम List[V] के साथ असंगत है। यह कैसे संभव है? त्रुटि) में Nil: List[P] के साथ Nil: Res को प्रतिस्थापित करती है (scastie)। त्रुटि से छुटकारा पाने के लिए आपको टाइप उपनाम को खत्म करने की आवश्यकता है। इसका मतलब है कि प्रकार उपनाम अपराधी है।

+1

भले ही यह एक कंपाइलर बग है, यह एक विधि के अंदर एक प्रकार के उपनाम घोषित करने के लिए अजीब और भ्रमित है और इसे इसके रिटर्न प्रकार का अनुमान लगाने के लिए उपयोग करें। –

+0

@ एम-जेड मैंने अभी इसे [तर्क पार्सिंग पुनरावृत्ति] में उपयोग किया है (http://stackoverflow.com/questions/38037089)। बताओ कि यह गलत है और आप बहुत बेहतर तरीके से जानते हैं। असल में, यह ओडरकी के कोरुसेरा पाठ्यक्रम द्वारा प्रचारित एक प्रोग्रामिंग शैली है। उन्होंने आपको सिखाया कि यदि आप फोल्ड लेफ्ट नहीं करते हैं, तो आप एक रिकर्सन करते हैं। रिकर्सन वर्कहोर है जो डिज़ाइन स्पेस को पुन: सक्रिय करने के लिए कोई विशेष माध्यम नहीं है, तो सब कुछ कर सकता है। रिकर्सन का मतलब है कि आपके पास एक मुखौटा कार्य है, जो उपयोगकर्ताओं से कॉल स्वीकार करता है लेकिन वास्तविक कार्यान्वयन 'आंतरिक' रिकर्सिव फ़ंक्शन द्वारा किया जाता है। –

+0

यही है, मूल कार्यात्मक पैटर्न 'def मुखौटा (args) = {def worker (पुनरावृत्ति, संचयक: ResType) है: ResType = if (done) acc else {.recursion।}; कार्यकर्ता (तर्क शुरू करना)}। 'जैसा कि आप देखते हैं, कार्यकर्ता का' एसीसी 'परिणामी प्रकार से मेल खाता है और आपको स्केल में कार्यकर्ता परिणाम प्रकार घोषित करने के लिए मजबूर होना पड़ता है। यही है, मुखौटा कोडिंग करते समय आपको अपने परिणाम प्रकार को दो बार निर्दिष्ट करने की आवश्यकता है। कृपया निम्नलिखित डीआरवाई को प्रदर्शित करने के लिए डाउनवोट करें, यह सबसे बुनियादी एफपी पैटर्न में गलत है और हमें खराब प्रोग्रामिंग प्रथाओं से बचाता है। कहें कि कार्यकर्ता को बाहर घोषित किया जाना चाहिए। कहें कि अंदर से इंद्रधनुष खराब गंध है। –

उत्तर

0

मुझे लगभग निश्चित है कि यह एक कंपाइलर बग है। स्कैला में टाइप उपनाम स्वचालित रूप से विस्तारित होने चाहिए, और ऐसा लगता है कि इस मामले में a का प्रकार [P](Option[P]) => List[P] के बजाय [P](Option[P]) => Res के रूप में अनुमानित है। और चूंकि Res एक आंतरिक दायरे में है, इसलिए संकलक इसे b के प्रकार का अनुमान लगाने के लिए नहीं ढूंढ सकता है।

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