2012-01-28 10 views
10

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

हालांकि, मैं एक इन्फ़िक्स प्रतीक (या अन्य छोटे, डीएसएल-y पहचानकर्ता) पर एक नाम स्थान डाल करने के लिए होने की तरह लग रहा है वास्तव में अजीब तो मैं मान पुनर्निर्यात करने के लिए परीक्षा रहा हूँ लग रहा है, इस तरह:

import qualified Data.Sequence as Seq 
(|>) = (Seq.|>) 
(<|) = (Seq.<|) 

क्या अब मुझे परेशान कर रहा है कि

  • मैन्युअल रूप से मूल्यों का पुन: निर्यात करना उबाऊ बॉयलरप्लेट जैसा लगता है।

  • मैन्युअल मूल्यों reexporting मौजूदा मॉड्यूल प्रणाली के आसपास चला जाता है और (मैं अभी तक भर में नहीं आया था और संभवत: अन्य बातों के)

    import qualified Data.Sequence as Seq 
    (:>) = (Seq.:>) --gives me a parse error: 
           --"Not in scope: data constructor `:>'" 
    

मैं कैसे करूँ डेटा कंस्ट्रक्टर्स के साथ काम नहीं लगता है इंफिक्स प्रतीकों और नेमस्पेसिंग को मेल करें? क्या मुझे बस छोड़ देना चाहिए और सबकुछ नाम देना सीखना चाहिए? क्या नेमस्पेसिंग और प्रतीकों के संबंध में हास्केल सर्वोत्तम प्रथाओं को स्थापित किया गया है?

import Data.Sequence ((|>), (<|), ViewR ((:>))) 
import qualified Data.Sequence as Seq 

यह केवल :>, |> और <| अयोग्य आयात करेगा, और योग्य छोड़ देगा:

उत्तर

19

खैर, एक बात आप कर सकते हैं यह दो बार आयात है। ध्यान दें कि :> एक डेटा कंस्ट्रक्टर है, इसलिए आपको इसके डेटा प्रकार (ViewR) को भी आयात करना होगा, लेकिन आप को ViewR के रचनाकारों को आयात करना होगा।

import Prelude hiding ((.)) 

आप एक समझदार लाइब्रेरी का उपयोग कर रहे हैं, प्रस्तावना के साथ कोई विरोध का मतलब पुस्तकालय कार्य करने के लिए बनाया गया है:

ही, यदि आप संघर्ष बारे में चिंतित हैं, तो आप सिर्फ ऑपरेटर के रूप में उपयुक्त छुपाना चाहिए को प्रतिस्थापित करें जो प्रीलूड फ़ंक्शन (उदाहरण के लिए Control.Category) ताकि आप इसे डिफ़ॉल्ट अर्थ को प्रतिस्थापित करना चाहें।

जहां तक ​​सर्वोत्तम प्रथाओं जाओ, मैं कभी नहीं देखा है किसी को भी योग्य ऑपरेटरों का उपयोग जब तक कि वहाँ एक संघर्ष है या वे GHCi पर कर रहे हैं। सभी ने बताया कि एक ऑपरेटर कहां से है, यह जानने के लाभ में भी फैक्टरिंग, यह कोड को बहुत कम पठनीय बनाता है।

8

मैं आम तौर पर प्रकार के नाम, निर्माणकर्ता और ऑपरेटरों अयोग्य आयात करते हैं, और बाकी सब कुछ योग्य:

import Data.Sequence (Seq, ViewL(..), ViewR(..), (|>), (<|)) 
import qualified Data.Sequence as Seq 

इस दोहरे आयात, अयोग्य प्रकार नाम शैली प्रलेखन द्वारा Data.Map और अन्य मानक कंटेनर की सिफारिश की है ।

फिर भी, आप हमेशा ऑपरेटरों अयोग्य आयात नहीं कर सकते - उदाहरण के तौर पर अगर आप एक ही मॉड्यूल में Array/Vector और Map उपयोग कर रहे हैं, तो आप दोनों अयोग्य से (!) आयात नहीं कर सकते। उस स्थिति में, मैं आमतौर पर इसे योग्यता का उपयोग करता हूं। यह अजीब लग रहा है, लेकिन यह अन्य विकल्पों की तुलना में बेहतर है (जैसे कि उनमें से एक के लिए संघर्ष से बचने के लिए अपने नाम से आना)। बेशक, शायद यह एक अच्छी बात है अगर यह (Data.Map.!) जैसे असुरक्षित कार्यों का उपयोग करने वाले लोगों को रोकता है :)

+0

जब मैं इसे आज़माता हूं, तो मुझे संकलन के दौरान निम्न त्रुटि मिलती है: 'जो कुछ भी' अनावश्यक 'का आयात होता है। क्या आपको यह भी मिलता है? क्या चेतावनी से छुटकारा पाना संभव है? – VF1

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