हाल ही में मैंने 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
भी दिखाया जा सकता है?
तो 'Num' _don't_ के उप-वर्गों में 'Eq' या' Show' क्या है? मुझे उन चीज़ों की कोई सूची नहीं दिखाई दे रही है जो (या वास्तव में क्यों बदला गया था) – charmlessCoin
यह 'वर्ग (एक ए, एक दिखाएं) => नाम जहां कहीं {...} ', अब यह सिर्फ 'कक्षा नम है जहां {...} '। सुपरक्लास के रूप में 'ईक' और 'शो' रखने की कोई आवश्यकता नहीं थी: एक 'न्यू' उदाहरण उन वर्गों में से किसी एक का उदाहरण नहीं दर्शाता है (जैसे 'ऑर्ड' का अर्थ' ईक' है), और न ही यह उन पर निर्भर करता है ('न्यू' के पास कोई कानून नहीं है, और इसकी 'विधियों' के लिए डिफ़ॉल्ट परिभाषाएं 'ईक' या' शो' 'का संदर्भ नहीं देती हैं। मुझे लगता है कि यही कारण है कि 'न्यू' एक अकेला वर्ग बन गया। कम आवश्यकताओं का मतलब है कि वर्ग अधिक उदाहरणों की अनुमति देता है, जैसे 'न्यू बी => न्यूम (ए -> बी) '। –
यह ध्यान रखना महत्वपूर्ण है कि यह एक जीएचसी परिवर्तन है; हास्केल मानक अभी भी 'शो' और' ईक 'सुपरक्लास की मांग करता है।सख्ती से, यह जीएचसी को गैर-हास्केल-अनुपालन संकलक बनाता है; हालांकि, यह परिवर्तन संभवतः अगले मानक में अपना रास्ता बना देगा, जैसे ही 'आवेदक' 'मोनाड 'का एक सुपरक्लास होगा। – David