2013-09-21 6 views
22

मैं हास्केल में संकलित कोड की इस पंक्ति को प्राप्त करने में सक्षम नहीं हूं लेकिन यह मेरे प्रोफेसर सिस्टम पर काम करता है। मैं ghci संस्करण 7.6.2 का उपयोग करें।कोड की हास्केल लाइन संकलित नहीं है: "अवैध डेटाटाइप संदर्भ"

data Eq a => Shape a = Shape a 

दरअसल, इस त्रुटि मैं

[1 of 1] Compiling Main    (test.hs, interpreted) 

test.hs:1:6: 
Illegal datatype context (use -XDatatypeContexts): Eq a => 
Failed, modules loaded: none. 

गलती यहाँ क्या है हो रही है है?

धन्यवाद

+0

संभावित डेटाप्लिकेट [अवैध डेटाटाइप संदर्भ "को कैसे ठीक करें (उपयोग -XDatatypeContexts)?] (Http://stackoverflow.com/questions/22622399/how-to-fix-illegal-datatype-context-use-xdatatypecontexts) – wizzup

उत्तर

31

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

  1. Eq a => निकालें और data Shape a = Shape a लिखें।

  2. जैसा कि जीएचसी कहते हैं, हटाए गए फीचर को फिर से सक्षम करने के लिए -XDatatypeContexts ध्वज दें।

और अधिक विस्तार में: अपने प्रकार घोषणा की Eq a => हिस्सा एक डेटाप्रकार संदर्भ कहा जाता है। इसका एकमात्र कार्य Shape कन्स्ट्रक्टर के प्रकार को प्रतिबंधित करना है, ताकि Shape :: a -> Shape a के बजाय आपको Shape :: Eq a => a -> Shape a मिलें। यह आपको Eq a लिखने से Shape एस के प्रकार हस्ताक्षरों में लिखने से नहीं बचाता है, और वास्तव में आपको उनको लिखने की भी आवश्यकता होगी जब आपको अन्यथा आवश्यकता नहीं होगी। यह एक बार उपयोगी था जब डेटाटाइप में सख्त क्षेत्रों को कक्षा की बाधा की आवश्यकता होती थी, लेकिन उस सुविधा को बहुत पहले हटा दिया गया था।

संक्षेप में, केवल संदर्भ को हटाने से आपके प्रोग्राम में हमेशा सुधार होता है, इसलिए उन्हें हास्केल 2011 भाषा मानक से निकाल दिया गया। चूंकि जीएचसी 7.0.1 में उन्हें बंद करने का विकल्प रहा है और 7.2.1 के बाद से यह डिफ़ॉल्ट है।

+0

निश्चित रूप से इस तरह के प्रतिबंध का उद्देश्य कुछ लिखने के लिए नहीं है बल्कि टाइप सुरक्षा को बेहतर बनाने के लिए मुझे अधिक लिखने के लिए मजबूर करना है, अन्यथा मुझे अन्यथा आवश्यकता होगी? – Psachnodaimonia

+0

क्षमा करें, सुरक्षा टाइप वास्तव में वह शब्द नहीं है जिसे मैं ढूंढ रहा हूं। मैं सोच रहा हूं कि संदर्भ जोड़ना प्रोग्राम सिंटैक्टिक संभावनाओं और मेरे अर्थपूर्ण इरादे के बीच एक कठिन लिंक बनाता है, और इस प्रकार टाइपिंग जांच करने से कुछ अर्थपूर्ण त्रुटियां असंभव हो जाएंगी। – Psachnodaimonia

+0

@ प्सचनोडाइमोनिया: यह एक अनुचित दृष्टिकोण नहीं है, लेकिन मुझे लगता है कि यह विशेष सुविधा सहायक से अधिक भ्रमित है, क्योंकि कई लोग उम्मीद करते हैं कि यह अलग-अलग तरीके से कैसे व्यवहार करता है। –

5

मुझे लगता है कि त्रुटि संदेश जो कहता है उसमें स्पष्ट है। इसके लिए आपको एक एक्सटेंशन की आवश्यकता है।

{-# LANGUAGE DatatypeContexts #-} 
data Eq a => Foo a = Foo a 

हालांकि डिफ़ॉल्ट रूप से, लेकिन GHC 7.6 से शुरू पर हुआ करता था इस विस्तार, इसके उपयोग deprecated माना जाता है और भविष्य में निकाल दिया जाएगा। तो आपका प्रोफेसर ghc का पुराना संस्करण उपयोग कर रहा है।

+0

हर बार उस लाइन को जोड़ने के बजाय (मुझे यह भी नहीं पता कि यह वास्तव में क्या करता है), मैंने 'डेटा का उपयोग करने का निर्णय लिया Foo a = Foo Eq' प्राप्त करने का निर्णय आपके उत्तर के लिए धन्यवाद :) – Goutham

+1

यह प्रकारों को बाधित करता है' ईयू उदाहरण के लिए, Foo ले सकते हैं। मान लीजिए कि 'बार' किसी भी प्रकार के' ईक 'उदाहरण के बिना एक प्रकार है, तो आपके पास' फू बार 'प्रकार नहीं हो सकता है। दूसरी तरफ 'ईक' प्राप्त करने से 'Foo' के लिए एक डिफ़ॉल्ट 'Eq' उदाहरण प्राप्त होगा। आपके पास एक प्रकार 'फू बार' हो सकता है (जहां 'बार' के पास' eq' उदाहरण नहीं है) लेकिन आप उस पर '==' का उपयोग नहीं कर सकते। – Satvik

3

यह भी देखें https://stackoverflow.com/a/22622591/2008899 जो "क्यों?" बताता है भाषा परिवर्तन के साथ-साथ एक जीएडीटी उदाहरण दिखा रहा है जो प्रदान करता है कि डेटाटाइप संदर्भ प्रदान करने के लिए किया गया था।

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