2015-08-06 3 views
10

तो मैं हास्केल सीख रहा हूँ और एक सरल कोड है जो सिर्फ एक स्ट्रिंग में प्रत्येक अक्षर को दोहराता है लिखना चाहते थे twice.So मैं इस के साथ आया था:हास्केल - हास्केल में गैर संपूर्ण पैटर्न मिलान

repl :: String->String 
repl " " = " " 
repl (x:xs) = x:x:repl xs 

अब जब मैं किसी चेतावनी लेकिन नहीं मिला संकलन एक रन-टाइम त्रुटि उत्पन्न हुई जब मैं repl "abcd" किया:

"abcd*** Exception: repl.hs:(2,1)-(3,23): Non-exhaustive patterns in function repl 

तो क्यों किया संकलक कभी नहीं इस सूचना दी और क्यों यह हास्केल में नजरअंदाज कर दिया है जब वहाँ OCaml तरह कई भाषाओं जो स्पष्ट रूप से रिपोर्ट कर रहे हैं संकलन के समय यह?

+3

'ghc -fwarn-inc omplete-pattern' उपयुक्त लगता है ... –

+4

अगर इसे-साथ संकलित किया गया तो इसे चेतावनी देना चाहिए। विशेष रूप से, ध्वज-फर्न-अपूर्ण-पैटर्न इस –

उत्तर

9

डिफ़ॉल्ट रूप से पैटर्न मिलान चेतावनी बंद कर दी गई है। आप -fwarn-incomplete-patterns के साथ या -W और -Wall के साथ चेतावनियों के बड़े बंडल के हिस्से के रूप में इसे चालू कर सकते हैं।

आप ghci से ऐसा कर सकते हैं:

Prelude> :set -W 

तुम भी झंडा ghc को जब आप अपने मॉड्यूल के शीर्ष पर एक pragma के रूप में संकलित या इसे शामिल पारित कर सकते हैं:

{-# OPTIONS_GHC -fwarn-incomplete-patterns #-} 

के लिए अपने विशिष्ट कार्यक्रम, इसे निम्नलिखित चेतावनी देना चाहिए:

/home/tjelvis/Documents/so/incomplete-patterns.hs:2:1: Warning: 
    Pattern match(es) are non-exhaustive 
    In an equation for ‘repl’: Patterns not matched: [] 
+0

के लिए जांच करता है ठीक है और क्या आप बता सकते हैं कि मैं कौन से पैटर्न उपरोक्त कोड में चूक गया? –

+1

"" एक स्ट्रिंग है जिसमें एक स्थान है। [] खाली सूची है, जो खाली स्ट्रिंग भी है। आप बिना अंतरिक्ष के "" भी लिख सकते थे। –

+1

@ अहिनावजैन: आपने खाली स्ट्रिंग को याद किया। ('" "एक सिंगल स्पेस कैरेक्टर वाला स्ट्रिंग है।) –

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