2011-05-28 11 views
8

मैं निम्नलिखित कोड काम करने के लिए उम्मीद नहीं थी:न्यूम पढ़ने पर इंटेल पढ़ने के लिए हास्केल डिफ़ॉल्ट रूप से क्यों दिखाई देता है?

foo :: (Num a) => a -> a 
foo x = x + x 

main = do 
    print (foo (read "7")) 

क्योंकि यह संभव पूरी तरह से के प्रकार (पढ़ें "7") अनुमान लगाने के लिए कोड के आधार पर नहीं है। लेकिन जीएचसी (6.12.3) अन्यथा सोचता है और प्रिंट करता है 14.

यदि "7" को "7.2" में बदल दिया गया है, तो कोड "कोई पार्स" के साथ विफल रहता है। यहाँ क्या चल रहा है? हास्केल कैसे निर्णय लेता है कि किस उदाहरण का उपयोग करना है?

+0

'(अंक एक, एक पढ़ें) => [चार] -> ए 'स्पष्ट रूप से संदिग्ध है। इसे किसी भी तरह से तय करना है, इसलिए मुझे लगता है कि 'Int'' Num 'के लिए डिफ़ॉल्ट होता है। शायद क्योंकि यह टाइपक्लास का पहला उदाहरण है? मैं मैन्युअल खोज करने जा रहा हूँ। यह एक दिलचस्प सवाल है। – alternative

+0

सिर्फ रिकॉर्ड के लिए: यह 'इंटीजर 'पर डिफ़ॉल्ट है, न कि' Int'। – sepp2k

उत्तर

12

यह हास्केल के defaulting rules for the Num class के कारण होता है। यदि आप अपनी फ़ाइल के शीर्ष करने के

default (Double, Integer) 

जोड़ा है, तो आप निम्न परिणाम प्राप्त करेंगे:

main = do 
    print (foo (read "7")) -- prints "14.0" 
    print (foo (read "7.2")) -- prints "14.2" 

संक्षेप में, दोषी नियम "सही काम करने की कोशिश करने की कोशिश कर रहे हैं "और जब आप अपने प्रोग्राम में अस्पष्ट प्रकार रखते हैं तो आपको संकलन त्रुटि से बचाते हैं। दुर्भाग्यवश इस मामले में यह रनटाइम त्रुटि के लिए एक संकलन-समय त्रुटि का व्यापार करता है।

तुम इतनी तरह दोषी निष्क्रिय कर सकते हैं:

default() 

जो आप स्पष्ट रूप से प्रकार एनोटेशन के माध्यम से इस तरह के शब्दों के प्रकार को स्पष्ट करने के लिए मजबूर होगा:

print (foo (read "7" :: Int)) 
2

इंट इस उदाहरण में डिफ़ॉल्ट प्रकार है। सेकंड देखें। 6.3, एम्बिगुइटी एंड टाइप डिफॉल्टिंग, हास्केल के इतिहास में: कक्षा के साथ आलसी होने के नाते,

+2

नोय 'Int', लेकिन 'इंटीजर' डिफ़ॉल्ट है। – augustss

+4

उस संदर्भ के लिए धन्यवाद। यहां वाक्य है जो यह स्पष्ट करता है कि वे इस तरह की एक गैर-हास्केल सुविधा क्यों शामिल करेंगे: "स्थिरांक पर संख्यात्मक गणना करना हास्केल प्रोग्रामर की पहली चीज़ों में से एक है"। इसलिए 2 + 2 पर ghci विफल होने से कुछ लोगों को बंद कर दिया जा सकता है। – Owen

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