2012-02-05 9 views
12

क्या मैं केवल लैम्बडास के लिए चेतावनी वाले गैर-संपूर्ण पैटर्न मैचों को अक्षम कर सकता हूं?क्या मैं केवल लैम्बडास के लिए "गैर-संपूर्ण पैटर्न मिलान" चेतावनी अक्षम कर सकता हूं?

मैं सामान्य रूप में चेतावनी की तरह है, लेकिन इस तरह वास्तविक लैम्ब्डा शाब्दिक के लिए नहीं:

map (\(x:xs)->...) ls 

मैं इस कोड यह बहुत स्पष्ट है कि मैं ls को हमेशा कम से कम एक तत्व के सभी मानों की उम्मीद करता है लगता है , और लैम्ब्डा में त्रुटि मामले को संभालने के लिए कोई साफ तरीका नहीं है। (मुझे लगता है कि मैं पैटर्न मैच को case कथन में स्थानांतरित कर सकता हूं, लेकिन यह केवल बदसूरत होगा।)

+0

बस आपको बताने के लिए, आमतौर पर चेतावनी को किसी भी भाषा में अंगूठे के नियम के रूप में दबाने का बुरा विचार है। मुझे एहसास है कि यह सुरक्षित हो सकता है, लेकिन आपके कोड के अन्य क्षेत्र असुरक्षित हो सकते हैं, और चीजें बदल सकती हैं: आप उन स्थितियों में पकड़े नहीं जाना चाहते हैं। – AJFarmar

उत्तर

14

हां, लेकिन केवल जीएचसी 7.2 में ही; -fno-warn-incomplete-uni-patterns पास करें (उदा। अपनी कैबल फ़ाइल के ghc-options फ़ील्ड में, या {-# OPTIONS_GHC#-} प्रोजेमा में अपनी फ़ाइल के शीर्ष पर)।

हालांकि, यह पैटर्न बाइंडिंग के लिए चेतावनी को भी अक्षम कर देगा, इसलिए let Just x = Nothing in x चेतावनी नहीं देगा। case बयान अप्रभावित हैं।

4

क्या आपके पास ऐसी स्थितियां अक्सर होती हैं? यह एक कोड गंध IMHO है। मैं कुछ ऐसे लैम्ब्डा देखना चाहता हूं और मुझे पूरा यकीन है कि हम एक बेहतर संस्करण बना सकते हैं जो रिक्त सूचियों को ठीक से संभालता है। और अन्य सभी मामलों में आप NonEmpty सूची प्रकार रैपर के लिए जा सकते हैं।

+0

वास्तविक संदर्भ अधिक जटिल था: मैं ऑपरेटर के रूप में अपनी व्याख्या की गई भाषा में उपयोग के लिए एक हास्केल फ़ंक्शन को लपेट रहा था। जिस तरह दुभाषिया काम करता है, मुझे गारंटी है कि एक ऑपरेटर को केवल दो तर्कों के साथ ही बुलाया जाएगा। मैंने चित्रण के लिए अभी एक बहुत ही सरल उदाहरण का उपयोग किया है। –

+1

@ टिखॉन: मैं देखता हूं। फिर भी आप अपने प्रकारों को अपने आविष्कारों को प्रतिबिंबित करने के बारे में सोच सकते हैं। शायद यह स्पष्ट और अधिक कुशल कोड का कारण बन जाएगा। याद रखें, अगर आप साबित नहीं कर सकते हैं (टाइप सिस्टम की मदद से) कि आपके इनवेरिएंट में सभी मामलों में है, तो हास्केल को रनटाइम पर जांचना होगा। – Ingo

3

map के मामले में, आप इसे एक सूची समझ के रूप में लिख सकते हैं।

[... | (x:xs) <- ls] 

यह कोई चेतावनी नहीं देगा। हालांकि, यदि एक खाली सूची दिखाती है, तो यह केवल अपवाद फेंकने के बजाय इसे फ़िल्टर कर देगा, जो त्रुटियों को छुपा सकता है। टाइप सुरक्षित मार्ग as Ingo suggests जा रहा है यदि आप इसके बारे में चिंतित हैं तो बेहतर विकल्प हो सकता है।

+0

नक्शा सिर्फ एक उदाहरण था - मेरे असली कोड में, मैं एक मानचित्र का उपयोग नहीं कर रहा हूं या यहां तक ​​कि एक सूची पर भी काम कर रहा हूं। –

+0

मैं यह जानना चाहता हूं कि मेरे पास [भ्रम] था (http://www.reddit.com/r/haskell/comments/38kl9z/thoughts_on_xlambdado_syntax/crw9y4r?context=3) सूची समझ और गैर-संपूर्ण चेतावनियों के बारे में कोड '[x | x '<- x's, चलो (बस x) = x'] 'ghc -Wall' के साथ चेतावनी उत्पन्न नहीं करता है, लेकिन गायब पैटर्न पर कोड क्रैश हो जाता है। यदि आप '<-' के lhs पर विनाशकारी करते हैं, तो व्यवहार अधिक संगत, कम भ्रमित है। –

3

मैं {-# OPTIONS_GHC -fno-warn-incomplete-uni-patterns #-} के बजाय {-# OPTIONS_GHC -fno-warn-incomplete-patterns #-} के लिए जाऊंगा। और मैं इसे कैबल फ़ाइल में डालने के बजाय प्रति-फ़ाइल दृष्टिकोण का उपयोग करने की अनुशंसा करता हूं क्योंकि इस तरह की चेतावनियां रखने के लिए आम तौर पर यह अच्छा अभ्यास होता है।

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