2010-10-22 7 views
7

Cabal मुझे मिश्रित संदेश दे रहा है। जब मैं कहता हूँ:क्या डेरिवफंक्टर एक अच्छी तरह से मान्यता प्राप्त विस्तार है? Cabal उलझन में लगता है

Extensions: DeriveFunctor 

इसे कहते हैं:

Warning: Unknown extensions: DeriveFunctor 

लेकिन जब मैं कहता हूँ:

GHC-Options: -XDeriveFunctor 

इसे कहते हैं:

Warning: Instead of 'ghc-options: -XDeriveFunctor' use 'extensions: 
DeriveFunctor' 

अभी के लिए मैं सिर्फ जा रहा हूँ {-# LANGUAGE DeriveFunctor #-} प्रज्ञा का उपयोग करने के लिए।

$ cabal --version 
cabal-install version 0.8.2 
using version 1.8.0.6 of the Cabal library 
$ ghc --version 
The Glorious Glasgow Haskell Compilation System, version 6.12.3 
$ basename $(mdfind haskell-platform | grep .dmg) 
haskell-platform-2010.2.0.0.i386.dmg 
+0

क्या GHC या हास्केल मंच के संस्करण प्रयोग कर रहे> –

+0

अधिक संस्करण जानकारी गयी। –

+0

मुझे इस विशेष चेतावनी के बारे में पता नहीं है, लेकिन मुझे लगता है कि फ़ाइल के अंदर एक भाषा प्रज्ञा जोड़ना वैसे भी सबसे अच्छा विकल्प है। –

उत्तर

4

Hackage documentation के अनुसार, कबाल-1.8.0.6 DeriveFunctor के रूप में मान्यता प्राप्त नहीं है। यह जीएचसी के लिए अपेक्षाकृत नया जोड़ा है और ऐसा लगता है कि इसका व्यापक उपयोग नहीं होता है, इसलिए मुझे आश्चर्य नहीं है कि इसे कैबल के लिए अनदेखा कर दिया गया होगा। इसे शायद कैबल के खिलाफ एक बग (फीचर अनुरोध?) के रूप में दायर किया जाना चाहिए।

@Tom Lokhorst सही है कि एक भाषा pragma सबसे अच्छा विकल्प है। मुझे Cabal के एक्सटेंशन फ़ील्ड का उपयोग करना पसंद नहीं है क्योंकि तब सभी एक्सटेंशन सभी मॉड्यूल के लिए सक्रिय हैं, जिन्हें मैं अक्सर नहीं चाहता हूं।

+1

ठीक है मैंने इसकी सूचना दी: http://hackage.haskell.org/trac/hackage/ticket/751 –

+1

बग रिपोर्ट सबमिट करने के लिए धन्यवाद; मैंने एक पैच जोड़ा है। –

7

आप अभी भी अपने .cabal फ़ाइल में extensions: DeriveFunctor उपयोग कर सकते हैं। हां, यह एक विस्तार नहीं है जो वर्तमान में कैबल को जाना जाता है, लेकिन आप अभी भी इसका उपयोग कर सकते हैं और जब तक संकलक इसे पहचान लेता है तो यह काम करेगा। दरअसल कैबेल जांच करेगा कि कंपाइलर एक्सटेंशन को पहचानता है, भले ही कैबल को इसके बारे में पता न हो।

मॉड्यूल Language.Haskell.Extension में एक्सटेंशन के एक केंद्रीय रजिस्ट्री नहीं है। इस रजिस्ट्री का उद्देश्य इतना है कि अलग-अलग कंपाइलर एक ही नाम पर सहमत हो सकते हैं जब वे समान एक्सटेंशन लागू करते हैं। हमारे पास अतीत में ऐसे मामले थे जहां विभिन्न कंपाइलरों के लेखकों ने गलती से एक ही विस्तार अवधारणा को अलग-अलग नाम दिए हैं। सभी एक्सटेंशन पंजीकृत होने की आवश्यकता नहीं है। यह समझ में आता है कि उन एक्सटेंशन को पंजीकृत न करें जो अभी भी अत्यधिक प्रयोगात्मक हैं, उदाहरण के लिए डीपीएच एक्सटेंशन "PArr" अभी भी पंजीकृत नहीं है। हैकेज को सभी अपलोड किए गए पैकेजों को केवल ज्ञात पंजीकृत एक्सटेंशन का उपयोग करने की आवश्यकता होती है, जो समझ में आता है कि एक वितरण एक वितरित पैकेज में उपयोग करने के लिए पर्याप्त रूप से तैयार है, तो पंजीकरण करना ठीक है।

इस विशेष मामले में, GHC devs विस्तार रजिस्टर करने के लिए भूल गए हैं दिखाई देते हैं।

यह भी ध्यान देने योग्य है कि Cabal-1.10 extensions फ़ील्ड को दो: default-extensions और other-extensions में विभाजित किया जा रहा है। यह इस मुद्दे को संबोधित करता है कि जॉन अपने उत्तर में बताता है कि पिछला व्यवहार यह है कि सभी एक्सटेंशन सभी मॉड्यूल के लिए सक्रिय हैं, जिन्हें हम स्वीकार करते हैं कि एक गलती है। other-extensions क्षेत्र (अर्थात् LANGUAGE pragma) कुछ मॉड्यूल में इस्तेमाल किया एक्सटेंशन सूचीबद्ध होने के लिए अनुमति देता है। अंततः लागू करें लागू करें कि वे सभी सूचीबद्ध हैं, जैसे कि सभी पैकेज निर्भरताओं को सूचीबद्ध किया गया है। भाषा निर्भरता भी निर्भरताएं हैं।

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