2017-02-14 8 views
5

मुझे आकार (minBound, maxBound) और विभिन्न अभिन्न प्रकारों की "दशमलव प्रतिनिधित्व में लंबाई" की जांच के दौरान कुछ अजीब व्यवहार देखने के लिए हुआ।ghci - डिफॉल्टिंग भ्रम

GHCi का उपयोग करना:

Prelude> :{ 
Prelude| let mi = minBound 
Prelude|  ma = maxBound 
Prelude|  le = fromIntegral $ length $ show ma 
Prelude| in [mi,ma,le] :: [Int] 
Prelude| :} 
[-9223372036854775808,922372036854775807,2] 
             ^
अंतिम स्थान पर रहा 19 उम्मीद करेंगे में

मेरा पहला अनुमान है कि () करने के लिए maxBound चूक है और इस तरह की पैदावार 2 है, लेकिन मुझे समझ नहीं आता कि क्योंकि ma स्पष्ट प्रकार एनोटेशन (:: [Int]) द्वारा एक Int होना चाहिए - ma नामित किया जाना चाहिए सभी प्रतीकों और निर्देशात्मक पारदर्शिता से बराबरी का।

यदि मैं ऊपर दिए गए कथन को फाइल में डालता हूं और इसे जीएचसीआई में लोड करता हूं, तो मुझे सही परिणाम मिलता है।

तो मुझे गलत परिणाम क्यों मिलता है?

+0

मुझे लगता है कि अपने पहले अनुमान बहुत करीब है, 'ma' ' एस प्रकार को तब तक 'Int' होने के लिए तय नहीं किया गया है, इसलिए' le' 'ma :: Bounded a => a' का उपयोग कर रहा है जो शो में '()' के लिए डिफ़ॉल्ट है। यदि आप इसे फिर से 'ma = maxbound :: Int' के साथ करते हैं तो आपको यह देना चाहिए 19. – jkeuhlen

+1

यह कैसे हो सकता है कि प्रकार ठीक नहीं है? – epsilonhalbe

+0

जब आप विपरीत व्यवहार की अपेक्षा करते हैं तो कोई भी व्यवहार भ्रमित हो सकता है। –

उत्तर

13

उलझन में, यह अभी भी नाटक पर मोनोमोर्फिज्म प्रतिबंध है (या इसके बजाय जीएचसीआई में इसकी कमी)। इसके बजाय वे mi, ma :: Bounded a => a के रूप में सामान्य रहने और a चर दो बार एक बार instantiated हो जाता है

  • - चूंकि GHCi monomorphism प्रतिबंध सक्षम, mi और ma की अपनी परिभाषा के Int को विशेष नहीं मिलता है के रूप में आपको लगता है कि वे नहीं है fromIntegral $ length $ show ma में () रूप
  • एक बार के रूप में Int[mi,ma,le] :: [Int]

में (जैसा कि आप देखा है, यह एक डिफ़ॉल्ट है) आपचाहते हैंऔर ma वास्तव में प्रकार Int का हो सकता है, उन्हें इस तरह के सीधे

Prelude> :{ 
Prelude| let mi, ma :: Int 
Prelude|  mi = minBound 
Prelude|  ma = maxBound 
Prelude|  le = fromIntegral $ length $ show ma 
Prelude| in [mi,ma,le] 
Prelude| :} 
[-9223372036854775808,9223372036854775807,19] 

व्याख्या या GHCi में मैन्युअल monormorphism प्रतिबंध पर बारी

Prelude> :set -XMonomorphismRestriction 
Prelude> :{ 
Prelude| let mi = minBound 
Prelude|  ma = maxBound 
Prelude|  le = fromIntegral $ length $ show ma 
Prelude| in [mi,ma,le] :: [Int] 
Prelude| :} 
[-9223372036854775808,9223372036854775807,19] 
+0

मैंने सोचा कि यह 'मोनोमोर्फिज्म रेस्ट्रिक्शन' के कारण हो सकता है लेकिन मैंने '-XNoMono ... '- जो पहले से ही जीएचसीआई में डिफ़ॉल्ट सेटिंग है, और गलत परिणाम मिला है – epsilonhalbe

+3

@epsilonhalbe यह एकमात्र प्रश्न है I एसओ पर उत्तर दिया है जहां कोई वास्तव में 'मोनोमोर्फिज्म रेस्ट्रिक्शन' (जैसा कि दूसरी तरफ के विपरीत) होना चाहता था। :) – Alec

+0

शायद इस तरह की बातों पर टिप्पणी करने लायक है कि क्यों मोनोमोर्फिज्म प्रतिबंध सामान्य रूप से एक अच्छा विचार है - जब तक कि आप अधिक सामान्य हस्ताक्षर नहीं देते हैं या आप स्पष्ट रूप से एक कार्य करते हैं (यानी '=' के बाईं ओर तर्क हैं), हो सकता है कि आप शायद अपने 'लेटिंग' को पॉलिमॉर्फिक होने की उम्मीद न करें। इस मामले में, आप इस वजह से 'mi' या' ma' polymorphic होने की अपेक्षा नहीं करते हैं। – Alec