2017-10-11 27 views
6

Prelude में null समारोह की परिभाषा है निम्नलिखित:हास्केल में शून्य कार्य की परिभाषा इतनी अजीब क्यों है?

null    :: [a] -> Bool 
null []   = True 
null (_:_)  = False 

क्या मुझे उलझन में परिभाषा की तीसरी पंक्ति है, यह क्यों लिखना है:

null(_:_)  = False 

के बजाय:

null any = False 

क्या इसमें कंपाइलर अनुकूलन के साथ कुछ भी करना है?

+1

नहीं। कोई फर्क नहीं पड़ता। परिभाषा यह बेहद स्पष्ट करती है कि कुछ भी याद नहीं किया गया था, लेकिन सूचियों के लिए जो वास्तव में एक बड़ा सौदा नहीं है। – dfeuer

+1

इसके अलावा, आप 'null = all (const झूठा)' परिभाषित कर सकते हैं। शायद यह स्पष्ट होगा। – dfeuer

उत्तर

5

क्या इसमें कंपाइलर अनुकूलन के साथ कुछ भी करना है?

नहीं, वास्तव में एक कह सकते हैं कि लेखन null (_:_)null any की तुलना में कम कुशल है (मामले में संकलक इस का अनुकूलन नहीं करता है), के बाद से अब आप को सत्यापित करने के हास्केल है कि यह वास्तव में "विपक्ष" है पूछो। यद्यपि यदि एक कंपाइलर डेटा प्रकारों पर कुछ बहीखाता करता है, तो इसे दूर करने के लिए निश्चित रूप से आसान है। जहां तक ​​मुझे पता है, ghc और लगभग जैसे अधिकांश कंपाइलर तीन साल के बच्चों द्वारा लिखे गए सभी कंपाइलर्स वास्तव में ऐसा करेंगे।

सबसे पहले यह बेहतर है एक सूची की परिभाषा के बाद से एक wilcard _ (या नाम यह any) लिखने के लिए नहीं (और किसी भी अन्य डेटा-प्रकार बदल सकता है)। हालांकि एक सूची के लिए बाधाएं बहुत ही असंभव हैं, लेकिन यह संभव हो सकता है कि कोई सूची को फिर से परिभाषित कर सके। उदाहरण के लिए:

data [a] = [] | (a:[a]) | (Int///[a]) 

उदाहरण के लिए बाद वाले पैटर्न का अर्थ है कि सूची कई बार दोहराई जाती है। उस स्थिति में, संकलक तीन वर्षीय बच्चे द्वारा लिखे गए नहीं हैं :) चेतावनी देगा कि null के लिए अपूर्ण पैटर्न: इस प्रकार यह दावा करेगा कि (_///_) पैटर्न निर्दिष्ट नहीं किया गया था। जबकि यदि आप वाइल्डकार्ड का उपयोग करते हैं, तो यह null any मामले में गिर जाएगी।

सामान्य रूप से देखभाल के साथ वाइल्डकार्ड का बेहतर उपयोग करता है: केवल अगर आप वास्तव में फ़ंक्शन को दिए गए कार्यों की परवाह नहीं करते हैं, तो आपको वाइल्डकार्ड का उपयोग करना चाहिए।

+4

यह * कम * कम कुशल नहीं है। कंपाइलर * हमेशा * इसे अनुकूलित करता है। – dfeuer

+2

@ डीफ्यूअर: यह एक अजीब दावा है, क्योंकि कोई विशिष्ट कंपाइलर का उल्लेख नहीं किया गया है। मैं दूसरे दिन एक हास्केल कंपाइलर लिख सकता हूं जो ऐसा नहीं करता है। मेरा दावा यह नहीं है कि एक अच्छा संकलक इसे अनुकूलित नहीं करता है। विचार केवल एक वाक्य रचनात्मक रूप से है, पूर्व कम कुशल है। :) –

+0

"वाक्य रचनात्मक रूप से कम कुशल" जैसी कोई चीज़ नहीं है। बीजगणितीय डेटा प्रकारों के साथ स्थैतिक रूप से टाइप की गई भाषाओं के डीस कंपाइलर हमेशा इसका अच्छा काम करते हैं। याद रखें कि संकलक को यह जांचना है कि प्रत्येक कन्स्ट्रक्टर का सही प्रकार है; जबकि यह उस पर है, यह आसानी से जांच सकता है कि सभी मौजूद हैं। यह जीएडीटी के लिए बहुत जटिल है, लेकिन वे यहां प्रासंगिक नहीं हैं। – dfeuer

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