2014-10-26 2 views
25

ghc के हाल के संस्करण आपको चेतावनी देंगे कि एक पूर्णांक अक्षर किसी दिए गए प्रकार की सीमा के बाहर है या नहीं। उदाहरण के लिए:क्या कोई हस्ताक्षरित पूर्णांक प्रकार है जो नकारात्मक अक्षर के बारे में चेतावनी देगा?

$ ghci 
>>> let x = 330492039485 :: Data.Word.Word8 
<interactive>:2:9: Warning: 
    Literal 330492039485 is out of the GHC.Word.Word8 range 0..255 

हालांकि, ghcData.Word प्रकार के लिए नकारात्मक सांख्यिक शाब्दिक के बारे में चेतावनी नहीं होंगे। इसके बजाय, यह underflows (जानबूझकर, प्रलेखन के अनुसार):

>>> let x = -1 :: Data.Word.Word8 
>>> x 
255 

वहाँ किसी भी प्रकार है कि नकारात्मक शाब्दिक के बारे में चेतावनी या वहाँ एक रास्ता मैं चेतावनी दी है कि मेरी स्वयं के कस्टम प्रकार बना सकते हैं होगा रहे हैं?

+0

Data.Word के स्रोत को देखते हुए, ऐसा लगता है कि संकलक कंपाइलर में अंतर्निहित हैं। छिपे हुए पैकेज ghc में 'Panic' मॉड्यूल है जो ऐसा लगता है कि यह चेतावनियों को उत्सर्जित कर सकता है, लेकिन यह एक बहुत ही इष्टतम समाधान की तरह नहीं लगता है। – bheklilr

+0

मैं हाल ही में इंटीजर का एक या दो 'उपप्रकार' चाहता हूं, अर्थात् प्राकृतिक और सकारात्मक (और सकारात्मक मेरे लिए वैकल्पिक है), जो आदर्श रूप से उनके कार्यान्वयन के लिए जीएमपी में कार्यों के 'mpn_' परिवार का उपयोग करेगा। हमारे पास टाइप स्तर पर 'नेट' है लेकिन मूल्य स्तर पर कुछ नहीं है, और यह मुझे अजीब के रूप में मारता है, इसलिए मैं प्रतिक्रियाओं पर नजर रखूंगा! – yatima2975

+3

आपके प्रश्न के लिए, एक भेदभाव किया गया है: क्या 'वर्ड 8' पूर्णांक मॉड्यूलो 256 का प्रतिनिधित्व करता है (इस मामले में तथ्य यह है कि '-1 == 255' पूरी तरह से उचित है), या यह सेट ' {0, ..., 255} '(किस मामले में' -1 == 255' बीमार टाइप किया जाना चाहिए)? यह गन्दा 'न्यू' डिजाइन में भी जुड़ा हुआ है; '(-)', 'negate' और'Interger' वहां नहीं होना चाहिए (अकेले 'abs' और' signum'!), लेकिन यह कीड़े का एक अलग प्रकार है ... – yatima2975

उत्तर

37

डिफ़ॉल्ट रूप से, -1 जैसे शाब्दिक negate (fromInteger 1) से वंचित है। हालांकि एक भाषा विस्तार NegativeLiterals है जो इसके बजाय fromInteger (-1) के रूप में desugar का कारण बनता है। के लिए सक्षम है कि आप एक चेतावनी मिलती है हैं: वैकल्पिक रूप से

Prelude> :m +Data.Word 
Prelude Data.Word> :set -W 
Prelude Data.Word> :set -XNegativeLiterals 
Prelude Data.Word> -1 :: Word 

<interactive>:74:1: Warning: 
    Literal -1 is out of the Word range 0..18446744073709551615 
18446744073709551615 
Prelude Data.Word> 

, आप अपने खुद के प्रकार है कि negate नए सिरे से परिभाषित कर सकता है, लेकिन फिर आप शायद ही एक रनटाइम त्रुटि मिलेगा।

+0

धन्यवाद! यही वह है जिसकी तलाश में मैं हूं –

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

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