2010-07-19 24 views
14

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

अगर मैं इन तीन मॉड्यूल है अस्पष्ट माना जाता है, भले ही केवल दो आयातित नामों में से एक इस संदर्भ में समझ में आता है मॉड्यूल Three में value को

module One where 

data Foo a = Foo { value :: a } 

---- 

module Two where 

data Bar a = Bar { value :: a } 

---- 

module Three where 

import One 
import Two 

foo = Foo { value = 42 } -- compile error here 
n = value foo -- and here 

अयोग्य संदर्भ। (एक OO भाषा में, foo.value और bar.value के लिए संदर्भ स्पष्ट हो जाएगा।)

बेशक मुझे Foo { One.value = 42 } लिख कर स्पष्ट करने कर सकते हैं के

, लेकिन यह अजीब लग रहा है। मैं फ़ील्ड को अलग-अलग नाम भी दे सकता हूं, उदा। "fooValue" और "barValue", लेकिन Foo { fooValue = 42 } में अनावश्यकता भी अजीब दिखती है।

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

इस प्रकार की स्थिति से बचने के लिए अनुभवी हास्केल डेवलपर्स चीजों का नाम कैसे प्रबंधित करते हैं, और उन्हें मॉड्यूल में व्यवस्थित करते हैं?

+0

मामूली बिंदु: आप 'बार' की परिभाषा में निर्माता को याद कर रहे हैं। –

+0

@ ट्रेविस ब्राउन: ओह, वह एक टाइपो था। इस पर ध्यान दिलाने के लिए धन्यवाद। – Wyzard

उत्तर

9

जीएचसी एक्सटेंशन -XDisambiguateRecordFieldsfoo = Foo { value = 42 } (लेकिन n = value foo नहीं) की अनुमति देगा।

हास्केल के वर्तमान रिकॉर्ड सिस्टम की कमी और इसके प्रतिस्थापन के लिए उम्मीदवारों के साथ-साथ कुछ हद तक पुस्तकालय जो अब अच्छे समाधान प्रदान करने का प्रयास करते हैं, पर large body of literature है। fclabels एकमात्र ऐसा है जिसे मैंने व्यक्तिगत रूप से उपयोग किया है।

This StackOverflow question समान है, और कुछ जवाब आपके लिए उपयोगी भी हो सकते हैं।

यह वास्तव में एक ही नाम है, लेकिन अलग, असंबंधित प्रकार पर काम कि विभिन्न मॉड्यूल में कार्यों की अधिक सामान्य मुद्दे का एक विशेष मामला है।

Qualified imports और एलियास आमतौर पर इस समस्या को हल करने के लिए पर्याप्त होते हैं।

1

यदि आप इन सभी प्रकारों पर एक सामान्य एक्सेसर फ़ंक्शन हैं, तो आप एक प्रकार की कक्षा पर विचार कर सकते हैं। जैसे

class Fieldable a where 
    field :: a -> b 

instance Fieldable (a,b) where 
    field = fst 

आदि

+1

क्या डेटाटाइप के फील्ड नाम क्लास इंस्टेंस का हिस्सा हो सकते हैं? यदि मैं 'वर्ग मूल्यवान एबी बना देता हूं जहां मूल्य :: ए -> बी' फिर मेरे दो प्रकारों को इसके साथ जोड़ना है, तो मुझे कुछ उदाहरण देना होगा जैसे' आवृत्ति मूल्यवान (Foo a) जहां मान = मान' और वह नहीं है मान्य ('मूल्य' संघर्ष के दो अर्थ)। ऐसा लगता है कि मैं एक वर्ग उदाहरण के हिस्से के रूप में एक फ़ंक्शन को परिभाषित नहीं कर सकता अगर उसका नाम पहले ही परिभाषित किया गया है। – Wyzard

2

कैसे अनुभवी हास्केल डेवलपर्स चीजों नाम है, और उन्हें मॉड्यूल में संगठित करने, स्थिति के इस प्रकार से बचने के लिए?

मैं केवल कुछ अनुभवी हास्केल डेवलपर्स के साथ काम किया है, और वे

data Foo a = Foo { foo_value :: a } 

data Bar a = Bar { bar_value :: a } 

या यहाँ तक कि

data Apocalypse a = A { ap_value :: a } 

सामान्य तौर पर की तरह भयंकर सामान करते हैं, मैं महसूस कर रही है कि एक बहुत है पुराने समय के हास्केलर्स को योग्य नाम पसंद नहीं हैं और वास्तव में यह दिखावा करना चाहते हैं कि दुनिया में अंधेरे युग से सीधे एक बड़ा नाम स्थान है। (एक समय है कि सी compilers फ़ील्ड नाम पर एक ही प्रतिबंध था, यही वजह है कि एक struct stat में मोड st_mode कहा जाता है और सिर्फ सादा नहीं mode है नहीं था।)

आप प्रकार वर्गों के साथ नाम ओवरलोड सकते हैं, लेकिन अनुभवी डेवलपर्स मुझे पता है कि मुफ्त प्रकार के वर्ग पसंद नहीं है। जब कभी लगता है कि एक प्रकार की कक्षा अनावश्यक होगी या नहीं, तो मैं कभी नहीं समझ सकता।

मुझे उम्मीद है कि एक दिन हास्केल लोग पदानुक्रमित नाम स्थान के साथ आते हैं और योग्य नामों का उपयोग करना शुरू कर देंगे। जैसा कि भगवान ने इरादा किया था।

+0

जब आप वास्तव में पॉलिमॉर्फिक रिकॉर्ड चयनकर्ता नहीं चाहते हैं, तो यह मुझे कुछ मामूली वाक्य रचनात्मक सुविधा के लिए मजबूर नहीं करने के लिए समझ में आता है। यहां तक ​​कि यदि आप योग्य चीजों का उपयोग कर सकते हैं, तो ऐसा लगता है कि शायद ही कभी इस्तेमाल किए जाने वाले क्षेत्र के लिए एक आम नाम का दावा करना, विशेष रूप से एक जिसे आमतौर पर केवल एक सहायक कार्य के माध्यम से पहुंचाया जाना चाहिए, खराब रूप है। – sclv

+0

मैं जितना संभव हो उतना योग्य नामों का उपयोग कर रहा हूं। भाषा स्वयं ही इसके साथ जुड़ी है; एकमात्र समस्या यह है कि हैडॉक योग्य नामों के साथ बहुत कम उपयोगी हो जाता है क्योंकि यह अभी भी एक बड़ा नामस्थान मानता है। (आप हैडॉक शो प्रकार के नामों को योग्य बना सकते हैं, लेकिन यह अभी भी हाइपरलिंक्स को अयोग्य घोषित करेगा।) –