2013-10-04 6 views
5

मैं जाँच कर रहा हूँ वहाँ टेम्पलेट Haskell के साथ कुछ वर्तमान अभ्यास नहीं है कि/कुछ लेंस fanciness की सरल मामले से निपटने के लिए:वर्तमान सबसे अच्छा अभ्यास के बारे में रिकॉर्ड वैश्विक नेमस्पेसिंग

data Person = Person { 
    name :: String, 
    ... 
} 

data Company = Company { 
    name :: String, 
    ... 
} 

वर्तमान में मैं कर रहा हूँ आयात को अर्हता प्राप्त करके वैश्विक नामस्थान प्रदूषण से परहेज करते हुए, लेकिन यह रिकॉर्ड-पहुंच को बेकार बना देता है।

import Person as P 

isFred :: Person -> Bool 
isFred p = (P.name p) == "Fred" 

क्या रिकॉर्ड फ़ील्ड तक पहुंचने के लिए वास्तव में कोई बेहतर तरीका नहीं है?


मैं एक ही जमीन को कवर करने वाले किसी अन्य प्रश्न के उपयोगी लिंक के कारण @ एमानुअल टौज़री के उत्तर को स्वीकार कर रहा हूं। दूसरा प्रश्न "हैकेल नेमस्पेस" पर एक खोज के लिए प्रदर्शित नहीं होता है। अन्य उत्तरों के साथ कुछ भी गलत नहीं है, लेकिन मैं केवल एक को स्वीकार कर सकता हूं।

उल्लिखित समाधान में टेम्पलेट हास्केल, लेंस, टाइप-क्लासेस और अधिक का उपयोग मूल रूप से एक फ़ील्ड "नाम" के साथ प्रत्येक क्षेत्र "हैसनाम" के लिए एक टाइपक्लास बनाने के लिए किया जाता है। प्रत्येक डेटा-प्रकार तब उस वर्ग का एक उदाहरण है जिसका कार्यान्वयन होता है। फिर कुछ जादू है जो मैं पूरी तरह से अलग-अलग प्रकारों को शामिल करने की इजाजत नहीं देता हूं।

किसी भी हास्केल न्यूबीज के लिए यह सोचने के लिए कि यह सब कुछ क्या है, ऐसा इसलिए है क्योंकि रिकॉर्ड्स मूल रूप से उस टुपल के दूसरे तत्व को चुनने के लिए सामान्य कार्यों के रूप में कार्यान्वित क्षेत्र-चयनकर्ताओं के साथ tuples हैं। यदि आप इन फील्ड-चयनकर्ता कार्यों को निर्यात करते हैं तो वे वैश्विक नामस्थान में बैठते हैं और जल्दी या बाद में (आमतौर पर जल्द ही) आपको एक संघर्ष मिलता है।

तो - आप या तो आयात (जैसे मेरे उपरोक्त उदाहरण में) अर्हता प्राप्त करते हैं या उन नामों के साथ आने का प्रयास करते हैं जो संघर्ष नहीं करते हैं (नाम का उपसर्ग और सर्वश्रेष्ठ के लिए आशा)।

लेंस सामान 2013 के रूप में सभी क्रोध है और फील्ड चयनकर्ताओं/गेटर्स + सेटर्स इत्यादि की संरचना की इजाजत देता है। लेंस का मूल विचार बहुत जटिल नहीं है लेकिन कार्यान्वयन मेरे सिर पर सही है।


रिकॉर्ड के लिए (हा!) मुझे लगता है कि अन्य पोस्ट में समाधान शायद मैं क्या कर रहा हूँ के बाद है, लेकिन यह एक बड़ी (5 एक्सटेंशन सिर्फ नकली रिकॉर्ड नेमस्पेसिंग करने के लिए) जादू की राशि को शामिल करता है।

उत्तर

2

ऐसा ही एक सवाल पहले से ही कहा गया था, और आप एक जवाब यहाँ लेंस सुझाव देख सकते हैं: https://stackoverflow.com/a/17488365/516188

अभी लेंस हास्केल समुदाय में एक बड़ा मूलमंत्र हैं, वे निश्चित रूप से उनके उपयोग है, और वे इस नेमस्पेसिंग समस्या, दीर्घकालिक समाधान के समाधान का हिस्सा हो सकता है। लेकिन वर्तमान में उस समस्या को हल करने के लिए केवल लेंस का उपयोग करने वाले लोग मुझे लगता है कि एक छोटी अल्पसंख्यक होगी। चूंकि निकिता वोल्कोव ने कहा, योग्य आयात और उपसर्ग इस बिंदु पर सामान्य समाधान होंगे।

अद्यतन: this other option के बारे में पता चला है जो अभी तक अंतिम नहीं है लेकिन प्रतीत होता है। इसका उल्लेख this blog post के अंत में किया गया है।

6

आम तौर पर केवल दो दृष्टिकोण हैं, लेकिन दुर्भाग्य से वहाँ समुदाय में उनके बारे में कोई consesus है:

  1. प्लेस अलग फ़ाइलों में हैं और उन्हें पूरा उर्फ ​​साथ योग्य में के रूप में उपयोग उनके खिलाफ कार्यों के साथ अपने रिकॉर्ड:

    import qualified Data.Person as Person; import Data.Person (Person) 
    
    isFred :: Person -> Bool 
    isFred p = (Person.name p) == "Fred" 
    

    इस दृष्टिकोण को जावा जैसी भाषाओं में समान मानें, जहां एक फ़ाइल में केवल एक वर्ग होता है।

  2. प्लेस एक ही फाइल में अपने रिकॉर्ड, रिकॉर्ड के नाम के साथ क्षेत्र नामों के पहले जबकि, उदा .:

    data Person = Person { 
        personName :: String, 
        personAge :: Int, 
        ... 
    } 
    
लेंस-पुस्तकालयों के

न तो इस समस्या दृष्टिकोण।

+0

इनमें से कोई भी वास्तव में इस मुद्दे को संबोधित नहीं करता है। यह उपसर्ग के विभिन्न प्रकार हैं। यह ओओ में कोई समस्या नहीं है क्योंकि विधियों/विशेषताओं का नामस्थान वर्ग/वस्तु तक सीमित है - यह आमतौर पर केवल क्लास नेमस्पेस है जो वैश्विक है। वैसे भी धन्यवाद - आखिरी चर्चा जो मुझे मिल सकती थी वह लगभग 18 महीने पुरानी थी। –

+1

बेहतर रिकॉर्ड सिस्टम को लागू करने के बारे में वार्ता हमेशा की तरह रही है। सुझाए गए समाधान के दर्जनों हैं। यहां तक ​​कि [हास्केल बोलियां भी हैं, जो इस मुद्दे को हल करती हैं] (http://en.wikipedia.org/wiki/Frege_ (प्रोग्रामिंग_भाषा) # रिकॉर्ड)। दुर्भाग्यवश हमें उन लोगों में से किसी के लिए इंतजार करना होगा। –

+0

हाँ - मैंने कुछ पुराने (मेरे सिर पर) चर्चाओं के माध्यम से उलझाया है। यह उन मामलों में से एक का अनुभव है जहां हम 90% समाधान साल पहले होने के बजाय अब से दस साल के 100% समाधान पर इंतजार करेंगे। –

0

मेरा दृष्टिकोण यहां है। व्यावहारिक रूप से, मुझे लगता है कि मुझे अक्सर रिकॉर्ड नाम निर्यात करने की आवश्यकता नहीं होती है, इसलिए नामस्थान प्रदूषण केवल मॉड्यूल के भीतर ही एक चिंता है।तो मैं तो जैसे एक छोटी उपसर्ग, आमतौर पर typeclass के पहले अक्षर का उपयोग करें,:

data Person = Person { 
    pName :: String, 
    ... 
} 

data Company = Company { 
    cName :: String, 
    ... 
} 

स्थितियों में, जहां मैं दूसरे मॉड्यूल सीधे एक क्षेत्र का उपयोग करने की अनुमति देने के लिए की आवश्यकता है में, यह आमतौर पर केवल एक या दो क्षेत्रों है। और अक्सर मैं केवल पढ़ने की अनुमति देना चाहता हूं। तो उस मामले में मैं थोड़ा रचनात्मक हो सकता हूं, शायद ऐसा कुछ।

module Whatever 
    { 
    Person, 
    personName, 
    Company, 
    companyName, 
    ... 
    } 

data Person = Person { 
    pName :: String, 
    ... 
} 

data Company = Company { 
    cName :: String, 
    ... 
} 

personName :: Person -> String 
personName = pName 

companyName :: Company -> String 
companyName = cName 
+0

हाँ, आप हमेशा फील्डनाम उपसर्ग कर सकते हैं। हास्केल रिकॉर्ड बनाने की लागत पर इस मुद्दे को सिडस्टेप करता है बाहरी संरचनाओं से मेल नहीं खाता और कोड को गुमराह करता है। –

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