2014-11-13 1 views
6

मैं Programming in Haskell पुस्तक और परीक्षण पढ़ रहा हूं जीएचसीआई दुभाषिया में उदाहरण प्रदान किए गए हैं। यह पता चला है कि Int में जीएचसीआई और हग्स दुभाषिया में प्रकार का व्यवहार है। "हास्केल में प्रोग्रामिंग" के अध्याय 3 के अनुसार, 2^31 :: IntInt प्रकार की सीमा से बाहर जाना चाहिए। इस बीच, GHCi दुभाषिया में मुझे मिलता है:क्यों इंटेल टाइप 2^31 जीएचसीआई में सीमा से बाहर नहीं जाता है?

Prelude> 2^31 :: Int 
2147483648 

जबकि हग्स में यह सिर्फ किताब की तरह बर्ताव का कहना है:

Hugs> 2^31 :: Int 
-2147483648 

GHCi में मैं भले ही परिणाम Int

Prelude> let x = 2^31 :: Int 
Prelude> :type x 
x :: Int 
Prelude> x 
2147483648 
के प्रकार है जाँच कर सकते हैं

वर्णित अंतर का स्रोत क्या है? क्या मुझे हग्स में पुस्तक से उदाहरणों को चलाया जाना चाहिए या जीएचसीआई का उपयोग करना चाहिए जो कि हास्केल सीखने के लिए अनुशंसित पसंद की तरह लगता है? मैं आपकी मदद के लिए आभारी रहूंगा।

+3

आपको सिर्फ गले को अनइंस्टॉल करना चाहिए – alternative

+0

@ वैकल्पिक: मुझे लगता है कि गले लगाए गए डाउनलोड को नीचे ले जाना चाहिए! या शायद एक अस्पष्ट स्थान पर चले गए और किसी प्रकार के हास्केल-विशिष्ट कैप्चा द्वारा संरक्षित किया गया है जिसके लिए जवाब देने के लिए Haskell98 और Haskell2010 के बीच अंतर के विस्तृत ज्ञान की आवश्यकता है ... – yatima2975

उत्तर

20

हास्केल में एक Intकम से कम[-2^29 .. 2^29-1] की एक श्रृंखला का समर्थन किया है, लेकिन यह भी हो सकती हैं। सटीक आकार आपके द्वारा उपयोग किए जाने वाले संकलक और आर्किटेक्चर दोनों पर निर्भर करेगा। (आप इस बारे में 2010 Haskell Report में, हास्केल भाषा के लिए नवीनतम मानक में और अधिक पढ़ सकते हैं।)

64 बिट मशीन पर जीएचसी के साथ, आपके पास [-2^63..2^63 - 1] की एक श्रृंखला होगी। लेकिन 32 बिट मशीन पर भी, मेरा मानना ​​है कि जीएचसी रेंज आपको सख्त न्यूनतम (संभवतः [-2^31..2^31 - 1]) से थोड़ा बड़ा होगा।

आप देख सकते हैं क्या वास्तविक बाध्य maxBound और minBound साथ हैं:

> maxBound :: Int 
9223372036854775807 

कार्यान्वयन के बीच मतभेद आ क्योंकि भाषा परिभाषा स्पष्ट उन्हें अलग अलग तरीकों से इन प्रकार लागू करने के लिए अनुमति देता है। व्यक्तिगत रूप से, मैं इसे GHCi का उपयोग करके इसे ध्यान में रखता रहूंगा, क्योंकि GHC अब तक का सबसे अधिक संभावित कंपाइलर उपयोग करेगा। यदि आप अधिक असंगतताओं में भाग लेते हैं, तो आप उन्हें मानक में देख सकते हैं या किसी से पूछ सकते हैं (बस यहां!); इसे सीखने के अनुभव के रूप में सोचें;)।

मानक इस कंपाइलर और आर्किटेक्चर को उनके कोड को अलग-अलग अनुकूलित करने की अनुमति देने के लिए इस संबंध में लचीला है। मुझे लगता है कि (लेकिन 100% निश्चित नहीं है) कि न्यूनतम सीमा 32-बिट सिस्टम के साथ दिमाग में दी जाती है, जबकि कंपाइलर को अपने आंतरिक उद्देश्यों के लिए अंतर्निहित 32-बिट मान से कुछ बिट्स का उपयोग करने देता है जैसे कि आसानी से अंतर करना पॉइंटर्स से संख्याएं। (कुछ जो मुझे पाइथन और ओकैमल जानता है, कम से कम करते हैं।) जीएचसी को ऐसा करने की ज़रूरत नहीं है, इसलिए यह अपने वास्तुकला के लिए उपयुक्त 32 या 64 बिट्स को उपयुक्त बनाता है।

+0

बहुत वर्णनात्मक उत्तर के लिए धन्यवाद :) हास्केल –

+3

@SzymonStepniak: कूल सीखते समय मैं आपकी सिफारिश का पालन करूंगा और 'ghci' तक चिपके रहूंगा। यदि आप किसी और भ्रमित असंगतता में भाग लेते हैं, तो यहां पूछने के लिए स्वतंत्र महसूस करें। –

+0

मैं निश्चित रूप से ऐसा करूँगा। एक बार फिर से धन्यवाद! –

4

सबसे अधिक संभावना है कि आप 64 बिट सिस्टम पर हैं जहां Int है, ठीक है, 64 बिट्स।

इस प्रयास करें:

Prelude> 2^62::Int 
4611686018427387904 
Prelude> 2^63::Int 
-9223372036854775808 
+0

सही, यह 64 बिट सीपीयू है। इसे इंगित करने के लिए धन्यवाद :) –

+0

"जहां एक इंट है, ठीक है, 64 बिट्स।" किसके कहता है? – newacct

+0

जीएचसी में 'Int' मशीन पूर्णांक का उपयोग करके लागू किया गया है। –

4

Int मशीन आकार का है। तो 32-बिट प्लेटफ़ॉर्म पर यह 2 पर बह जाएगा।

$ ssh [email protected] 
Linux raspberrypi 3.12.28+ #709 PREEMPT Mon Sep 8 15:28:00 BST 2014 armv6l 

The programs included with the Debian GNU/Linux system are free software; 
the exact distribution terms for each program are described in the 
individual files in /usr/share/doc/*/copyright. 

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent 
permitted by applicable law. 
Last login: Tue Nov 11 12:58:20 2014 from 192.168.0.102 
[email protected]:~$ ghci 
GHCi, version 7.8.2: http://www.haskell.org/ghc/ :? for help 
Loading package ghc-prim ... linking ... done. 
Loading package integer-gmp ... linking ... done. 
Loading package base ... linking ... done. 
Prelude> 2^31 :: Int 
-2147483648 

नोट हास्केल रिपोर्ट वास्तव में निर्दिष्ट नहीं है कितना बड़ा Int होना चाहिए, वास्तव में – टिकोन Jelvis कहते हैं, यह केवल 2 को संभालने के लिए गारंटी है। लेकिन जीएचसी निश्चित रूप से सभी मशीन पूर्णांक का उपयोग करता है, जो आम तौर पर काफी इष्टतम प्रदर्शन होता है- और आवश्यकता के अनुसार।

+0

के लिए धन्यवाद जवाब, अब यह उचित लग रहा है :) –

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