2011-12-26 11 views
14

मैं GHCi 7.0.3 का उपयोग कर रहा निम्नलिखित प्रोग्राम है जो प्रकार स्तरीय सूची को लागू करता है के साथ के रूप में काम नहीं करता है:XTypeOperators विस्तार pragma

{-# LANGUAGE TypeOperators #-} 

data True 
data False 

-- List 
data Nil 
data Cons x xs 

-- Type-level infix operator must begin with ':' 
data x ::: xs 
infixr 5 ::: -- set precedence level to 5 (tight) 

यह कम्पाइल, लेकिन जब मैं के साथ यह परीक्षण:

:t (undefined :: True:::Nil) 

(क्या undefined के प्रकार है जब टाइप करने के लिए True:::Nil डाली?) मैं इस त्रुटि मिलती है:

Illegal operator `:::' in type `True ::: Nil' 
    Use -XTypeOperators to allow operators in types 

और वास्तव में, जब मैं ध्वज के साथ GHCi शुरू

-XTypeOperators 

मैं उम्मीद परिणाम प्राप्त:

(undefined :: True ::: Nil) :: True ::: Nil 

मेरा प्रश्न है:

{-# LANGUAGE TypeOperators #-} 
: क्यों बराबर pragma काम नहीं करता है

संपादित करें: अगर प्रागम्स जीएचसीआई पर्यावरण में विस्तार नहीं करते हैं तो मेरे पास एक और पहेली है।

{-# LANGUAGE MultiParamTypeClasses #-} 
{-# LANGUAGE FunctionalDependencies #-} 

लेकिन एक बार संकलित, मैं GHCi में इसका इस्तेमाल कर सकते:

class And b1 b2 b | b1 b2 -> b where 
    andf :: b1 -> b2 -> b 

-- truth table 
instance And True True True where andf = undefined 
instance And True False False where andf = undefined 
instance And False True False where andf = undefined 
instance And False False False where andf = undefined 

यह निम्न pragmas आवश्यक: मैं इस कार्यक्रम की कोशिश की

*Main> :t andf (undefined::True) (undefined::False) 
      andf (undefined::True) (undefined::False) :: False 

मैं सूची मामले में लगता है दुभाषिया टाइप-स्तरीय ऑपरेटर ::: के साथ अभिव्यक्ति को भी पार्स नहीं कर सका, जबकि मल्टीपार्मेटर कक्षाओं के मामले में कमांड लाइन पारदर्शी थी। लेकिन, इसके बारे में सोचने के लिए आओ, जीएचसीआई ने बहु-पैरामीटर वर्गों और कार्यात्मक निर्भरताओं का उपयोग करके प्रकार अनुमान लगाया, है ना? इस प्रकार की अनुमान जीएचसीआई में किया जाता है, और संकलित कोड में कुछ फ़ंक्शन को कॉल करके नहीं, है ना?

उत्तर

14

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

उदाहरण के लिए, यहाँ मेरा अभी की तरह दिखता है:

:set prompt "∀x. x ⊢ " 
:set -XTypeOperators 
import Control.Monad 
import Control.Applicative 
import Control.Arrow 

.ghci फ़ाइल में जो कुछ भी आपके सिस्टम के मानक स्थान ऐसी फ़ाइलों के लिए है चला जाता है।


अपने विस्तारित सवाल का जवाब करने के लिए: प्रश्न में कोड GHCi में काम करता है, मोटे तौर पर, क्योंकि यह भी है, तो एक और मॉड्यूल है, जो pragmas का उपयोग कर मॉड्यूल आयातित लेकिन उन्हें खुद को सक्षम नहीं किया है में प्रयोग किया जाता काम करेगा। जीएचसी एक प्रति-मॉड्यूल आधार पर एक्सटेंशन सक्षम करने में सक्षम है, भले ही निर्यात की गई परिभाषा संभवतः विस्तार के बिना समझ में न हो, या अनुमानित प्रकारों की आवश्यकता हो।

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

+1

+1 .ghci फ़ाइल के लिए +1 –

7

आपका प्राग सही है; समस्या यह है कि आप इसे जीएचसीआई के भीतर से उपयोग करने का प्रयास कर रहे हैं, जो लोड किए गए मॉड्यूल के विस्तार का वारिस नहीं करता है, लेकिन आपके द्वारा सूचीबद्ध फ़ाइलों को संकलित करने के लिए जीएचसी को दिए गए विकल्पों को पास करता है (जो है प्रज्ञा के समान प्रभाव क्यों है)।

आप pragma रखना चाहिए, और या तो -XTypeOperators पारित जब आप GHCi प्रारंभ करें, या फ़ाइल लोड करने के बाद इसे सक्षम इस प्रकार है:

GHCi> :set -XTypeOperators 

कौन सा बहुत अवांछनीय है, और शायद कई में असंभव हो सकता है मामलों के लिए, उदाहरण के लिए संकलित मॉड्यूल लोड हो रहा है।

4

LANGUAGE प्रगामा स्रोत फ़ाइल के लिए काम करता है, यह ghci -prompt तक प्रचारित नहीं है। चूंकि किसी प्रोजेक्ट की कई स्रोत फ़ाइलों में विरोधाभासी प्रगति हो सकती है, इसलिए स्रोत pragmas डिफ़ॉल्ट रूप से ghci -prompt पर प्रचारित नहीं हो सकता है। प्रोजेक्ट *module से प्रोजेक्ट को प्रॉम्प्ट पर प्रभावी बनाना संभव होगा, मुझे यकीन नहीं है, लेकिन मुझे लगता है कि इसे लागू करने के लिए यह विचार किया जाता है, वैसे भी, इसे लागू नहीं किया गया है, इसलिए आपको ghci के लिए एक्सटेंशन सेट करने की आवश्यकता है स्पष्ट रूप से।

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