2010-07-08 15 views
18

निर्यात करने से इंकार कर देता है मैं एक मॉड्यूल लिखना चाहता हूं जो कुछ मॉड्यूल को पुन: निर्यात करता है जिसे उसने योग्य आयात किया था। कुछ इस तरह:जीएचसी योग्य मॉड्यूल

module Foo.A 
    (module Foo.B 
    , module Foo.C 
) where 
import qualified Foo.B 
import qualified Foo.C 

-- bunch of code using Foo.B and Foo.C here 

ऐसा लगता है कि यह काम करना चाहिए; हालांकि, GHC निर्यात के बारे में चेतावनी प्रिंट:

Foo/A.hs:2:5: 
    Warning: the export item `module Foo.B' exports nothing 

Foo/A.hs:3:5: 
    Warning: the export item `module Foo.C' exports nothing 

और GHCi उन लोगों से निर्यात लोड करने के लिए मना कर दिया।

मैं आयात को अयोग्य बनाकर हल कर सकता हूं, लेकिन फिर उन आयातों और मुख्य मॉड्यूल कोड के बीच विवादों का नामकरण होने की संभावना है।

क्या इन मॉड्यूल को जीएचसी निर्यात करने का कोई तरीका है?

उत्तर

12

नहीं, यह केवल जीएचसी की सीमा नहीं है, यह आयात आयात है और निर्यात हास्केल में काम करने के लिए डिज़ाइन किया गया है।

एक मॉड्यूल में केवल अपने नामस्थान का नियंत्रण है - यह प्रभावित नहीं कर सकता कि अन्य नामस्थानों से क्या देख सकता है। एक मॉड्यूल "पुनः निर्यात" कहने के लिए सिर्फ एक शॉर्टेंड है "मेरे सभी नामस्थान में प्रतीकों के सभी निर्यात करें जो को उस अन्य मॉड्यूल से यहां आयात किया गया है"। लेकिन आपके द्वारा योग्य आयात किए गए प्रतीकों वास्तव में आपके नामस्थान में नहीं हैं।

यदि आप दो अलग-अलग प्रतीकों को निर्यात करना चाहते हैं जिनमें समान नाम है, तो आप इसे एक मॉड्यूल से नहीं कर पाएंगे। मॉड्यूल को दो में विभाजित करें, और प्रत्येक संस्करण को से एक अलग मॉड्यूल निर्यात करें।

+4

लेकिन योग्य प्रतीकों को फिर से निर्यात करना संभव है; उदाहरण के लिए, 'योग्य Foo.B आयात करें' मुझे मॉड्यूल Foo.A (Foo.B.sym) 'करने देगा। मॉड्यूल के साथ यह क्यों संभव नहीं है? मैं एक ही नाम के साथ दो प्रतीकों का निर्यात नहीं कर रहा हूं; कुछ भी विरोधाभासी मॉड्यूल के लिए आंतरिक है। –

6

यह सीमा एक सुविधा भी है जब आयात मॉड्यूल एक आयातित आयात की घोषणाओं के आधार पर आयातित मॉड्यूल में कुछ नामों को फिर से घोषित करने के लिए है। उदाहरण के लिए:

module MyPrelude (succ, module Prelude) where 

import qualified Prelude as P (succ) 
import Prelude hiding (succ) 

succ :: ... 
succ = ... P.succ ... 

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

क्यों आप व्यक्तिगत कुछ मॉड्यूल का नाम आप आयात नहीं किया था, एक kludge तरह heirarchical मॉड्यूल GHC में heirachically काम करने के लिए प्राप्त करने के लिए लगता है कि द्वारा योग्य प्रतीकों पुनर्निर्यात करने में सक्षम हैं के रूप में। Foo.A आयात करते समय Foo.B योग्य प्रतीकों को प्राप्त करना जादुई है, और मुझे लगता है क्योंकि यह नाम Foo.A की तुलना में वास्तविक विरासत पूर्वजों का नाम नहीं है, लेकिन वैकल्पिक योग्यता वाले चीज़ों को निर्यात करने का इच्छित उपयोग उन मामलों में है जहां इसका उपयोग किया जाता है फू से मुझे नहीं लगता कि यह व्यवहार जीएचसी एक्सटेंशन के बिना बिल्कुल समझ में आता है, इसलिए मैं एक जंगली अनुमान लगाने जा रहा हूं कि इसका जीएचसी विशिष्ट है।

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