2011-09-15 15 views
60

मैं बस कुछ हास्केल विकास कर रहा था और मैं GHC का एक नया संस्करण पर कुछ पुराने कोड कंपाइल:डेटाटाइप कॉन्टैक्स नवीनतम जीएचसी में गिरावट: क्यों?

The Glorious Glasgow Haskell Compilation System, version 7.2.1 

और जब मैंने किया था मैं निम्न त्रुटि प्राप्त:

Warning: -XDatatypeContexts is deprecated: It was widely considered a misfeature, and has been removed from the Haskell language.

कि जब आप प्रकट होता है

data Ord a => MyType a 
    = ConstructorOne a 
    = ConstructorTwo a a 

मेरा प्रश्न है: निम्न स्वरूप में कोड है क्यों इस सुविधा पहली जगह में पदावनत और क्या था मैं मैं क्या करना चाहिए समान या समान कार्यक्षमता प्राप्त करने के लिए nstead?

+11

बस संदर्भ हटाएं और आपका कोड अभी भी काम करेगा। – augustss

+0

यदि आपको 'कैबल इंस्टॉल ' की कोशिश करते समय कोई संबंधित त्रुटि मिल रही है, तो 'कैबल इंस्टॉल --ghc-option' -XDataTypeContexts '' आज़माएं। – ntc2

उत्तर

86

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

"प्रतिस्थापन" है, जो वास्तव में अन्य तरह से काम करता है और आप के लिए जाना जाता संदर्भों ट्रैक करता है, use GADT-style declarations instead के लिए है:

सामान्य रूप में
data MyType a where 
    ConstructorOne :: Ord a => a -> MyType a 
    ConstructorTwo :: Ord a => a -> a -> MyType a 

GADTs रूप में अच्छी तरह अन्य कई तरीकों से अधिक लचीले होते हैं, लेकिन इस के लिए विशेष मामला क्या होता है कि बनाने के लिए एक मूल्य को Ord बाधा की आवश्यकता होती है, जिसे तब मूल्य के साथ ले जाया जाता है, और कन्स्ट्रक्टर पर मिलान पैटर्न पैटर्न इसे वापस खींचता है। इसलिए आपको इसका उपयोग करने वाले कार्यों पर संदर्भ की भी आवश्यकता नहीं है, क्योंकि आप जानते हैं कि MyType a के प्रकार की अपेक्षा करने के आधार पर, आपको इसके साथ Ord a बाधा मिलेगी।

+0

आखिरी वाक्य थोड़ा अस्पष्ट लगता है-जो आप जीएडीटी कन्स्ट्रक्टर से खींचते हैं वह बाधा नहीं है बल्कि बाधा को संतुष्ट करने वाला उदाहरण है। – dfeuer

+0

लेकिन यदि बहुत सारे रचनाकार हैं तो क्या यह प्रत्येक के लिए 'ऑर्ड ए' दोहराने के लिए बहुत वर्बोज़ नहीं बनता है? – fakedrake

+1

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

8

सामान्य रूप से, आपको अभी भी Ord a किसी भी फ़ंक्शन में बाधा जोड़ने की आवश्यकता है जो आपके MyType प्रकार का उपयोग करता है, और जैसा कि यह प्रतीत होता है उतना उपयोगी नहीं है। कारण है कि वे हटा दिया गया है के बारे में अधिक जानकारी के लिए, क्योंकि यह एक misfeature था, और वास्तव में है किसी भी उपयोगी कार्यक्षमता नहीं किया http://hackage.haskell.org/trac/haskell-prime/wiki/NoDatatypeContexts

-1

मुझे यह त्रुटि भी मिल रही थी। एनटीसी 2 के सुझाव ने मेरे लिए काम किया, सिवाय इसके कि यह 'टाइपकॉन्टेक्स्ट' में छोटे 'टी' के साथ होना चाहिए, यानी cabal install --ghc-option '-XDatatypeContexts' <package>