2015-05-30 10 views
5

में फ़ील्ड मानों और स्थानीय दायरे के बीच नामकरण संघर्ष यह एक कोडिंग शैली प्रश्न है बल्कि तकनीकी एक है।हास्केल

मुझे अक्सर एक समस्या का सामना करना पड़ा है जहां मैं data प्रकार बनाने के लिए हैकेल (कम से कम इष्टतम) रिकॉर्ड सिंटैक्स (या लेंस, समस्या समाप्त होती है) का उपयोग करता हूं। मैं अपने क्षेत्र के नाम पर फ़ील्ड एक्सेसर फ़ंक्शंस के साथ समाप्त होता हूं। एक ईमानदार प्रोग्रामर होने के नाते, मैं अपने रिकॉर्ड फ़ील्ड नामों को सार्थक बनाने की कोशिश करता हूं।

किसी बिंदु पर मुझे अपने प्रकार से एक फ़ील्ड प्राप्त करने और स्थानीय मान में अपना मान रखने की आवश्यकता है। यह अक्सर do ब्लॉक में राज्यमोनाड के भीतर किया जाता है। प्रश्न यह है कि मैं स्थानीय चर को क्या कहूं। सबसे स्पष्ट नाम पहले से ही फील्ड एक्सेसर के रूप में लिया गया है। मैं संक्षेप में अपना स्वयं का पता लगाता हूं जो मेरे कोड को कम पठनीय बनाता है।

क्या कोई हास्केल कोडिंग सम्मेलन है जो इस मुद्दे को संबोधित करता है?

उदाहरण

data Qaax = Qaax { 
     foo :: SomeFoo 
    , bar :: SomeBar 
    , ... 
    } 

baz :: (MonadState Qaax m) => (...) -> m() 
baz (...) = do 
    f <- gets foo -- I'd really like to use something more descriptive then 
       -- `f` but `foo` is already taken. 
    ... 
    return() 

उत्तर

3

'प्रत्यय के रूप में' जोड़ना अलग-अलग-संबंधित नाम बनाने के लिए एक स्थापित सम्मेलन है। एक महत्वपूर्ण उदाहरण foldl और foldl' है।

foldl' जैसे निर्यात किए गए नामों में आमतौर पर एक अच्छी थीम के साथ आने का एक अच्छा विचार है कि 'आपकी लाइब्रेरी के लिए इसका मतलब क्या है (अक्सर यह "का कठोर संस्करण" है, जैसा कि foldl' में है)। लेकिन स्थानीय नामों में आप इसका उपयोग करने के लिए बहुत अधिक स्वतंत्र हो सकते हैं "एक और बारीकी से संबंधित चीज जिसे मैं वही नाम रखना चाहता हूं"।

नकारात्मकता यह है कि यह बहुत विशिष्ट नहीं है, इसलिए यह पठनीयता को नुकसान पहुंचा सकता है; विशेष रूप से यदि आपको आमतौर पर दोनों संस्करणों को संदर्भित करने की आवश्यकता है। और जब आपको खुद को foo''' की आवश्यकता होती है तो आपको शायद एक अलग नामकरण योजना के बारे में सोचना चाहिए!

2

NamedFieldPuns विस्तार इस के साथ कर सकते हैं। पैटर्न मिलान एक रिकार्ड पर है, यह एक रिकॉर्ड क्षेत्र के रूप में एक ही नाम के साथ एक चर बांधता है जब:

{-# LANGUAGE NamedFieldPuns #-} 

baz :: (MonadState Qaax m) => m() 
baz = do 
    Qaax {foo} <- get 
    return() 

एक संभावित समस्या यह है कि एक्सेसर do ब्लॉक के आराम के लिए आच्छादित है है।