2013-10-11 9 views
12

हाल ही में मैंने LYAH का उपयोग करके हास्केल पर एक नज़र डाली।हास्केल "न्यू एक्स" को "एक्स दिखाएं" की आवश्यकता क्यों है?

मैं चारों ओर प्रकार वर्गों के साथ खिलवाड़ किया गया था और इस त्वरित परीक्षण समारोह लिखा है:

foo :: (Num x) => x -> String 
foo x = show x ++ "!" 

लेकिन वह इस त्रुटि पैदा करता है:

test.hs:2:9: 
    Could not deduce (Show x) arising from a use of `show' 
    from the context (Num x) 
    bound by the type signature for foo :: Num x => x -> String 
    at test.hs:1:8-29 
    Possible fix: 
     add (Show x) to the context of 
     the type signature for foo :: Num x => x -> String 

लेकिन अनुसार LYAH रहे हैं:

To join Num, a type must already be friends with Show and Eq.

तो अगर Num में सब कुछ Show औरका सबसेट है, इस काम के लिए मुझे टाइप हस्ताक्षर को foo :: (Num x, Show x) => x -> String में बदलने की आवश्यकता क्यों है? क्या यह अनुमान लगाना संभव नहीं है कि Num भी दिखाया जा सकता है?

उत्तर

18

LYAH में जानकारी पुरानी है। release notes for GHC 7.4.1 का कहना है कि:

The Num class no longer has Eq or Show superclasses.

आप लिखने के लिए की आवश्यकता होगी,

foo :: (Num x, Show x) => x -> String 

(वास्तव में, foo आप ने लिखा Num x की आवश्यकता नहीं है, तो आप छोड़ सकते हैं कि एक अनावश्यक बाधा से बचने के लिए।)

+1

तो 'Num' _don't_ के उप-वर्गों में 'Eq' या' Show' क्या है? मुझे उन चीज़ों की कोई सूची नहीं दिखाई दे रही है जो (या वास्तव में क्यों बदला गया था) – charmlessCoin

+6

यह 'वर्ग (एक ए, एक दिखाएं) => नाम जहां कहीं {...} ', अब यह सिर्फ 'कक्षा नम है जहां {...} '। सुपरक्लास के रूप में 'ईक' और 'शो' रखने की कोई आवश्यकता नहीं थी: एक 'न्यू' उदाहरण उन वर्गों में से किसी एक का उदाहरण नहीं दर्शाता है (जैसे 'ऑर्ड' का अर्थ' ईक' है), और न ही यह उन पर निर्भर करता है ('न्यू' के पास कोई कानून नहीं है, और इसकी 'विधियों' के लिए डिफ़ॉल्ट परिभाषाएं 'ईक' या' शो' 'का संदर्भ नहीं देती हैं। मुझे लगता है कि यही कारण है कि 'न्यू' एक अकेला वर्ग बन गया। कम आवश्यकताओं का मतलब है कि वर्ग अधिक उदाहरणों की अनुमति देता है, जैसे 'न्यू बी => न्यूम (ए -> बी) '। –

+3

यह ध्यान रखना महत्वपूर्ण है कि यह एक जीएचसी परिवर्तन है; हास्केल मानक अभी भी 'शो' और' ईक 'सुपरक्लास की मांग करता है।सख्ती से, यह जीएचसी को गैर-हास्केल-अनुपालन संकलक बनाता है; हालांकि, यह परिवर्तन संभवतः अगले मानक में अपना रास्ता बना देगा, जैसे ही 'आवेदक' 'मोनाड 'का एक सुपरक्लास होगा। – David

1

आप लिख नहीं चाहिए:

(Num x) => x -> String 

के बजाय

(Num x) x -> String 

और जहाँ तक मुझे पता है इस विरासत को कम से कम पुरानी हो चुकी है।

3

यह used to be कि Num का एक उदाहरण भी Show और Eq का एक उदाहरण था, लेकिन है कि no longer the case है।

आपको Show बाधा भी जोड़नी होगी।

3

हास्केल, 98 और 2010 दोनों को नम के सभी उदाहरणों को शो और ईक पर भी उदाहरणों की आवश्यकता होती है। यह काफी हद तक इतिहास का दुर्घटना है।

जीएचसी, सबसे लोकप्रिय हास्केल कंपाइलर, यहां किसी भी प्रगति की आवश्यकता के बिना मानक से अलग हो जाता है। यह आवेदक फंक्चर को न्यूम के उदाहरण होने और ओवरलोडेड सिंटैक्स के लाभों का आनंद लेने के लिए किया गया था।

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