2011-12-23 18 views
16

हास्केल में, मैं अक्सर $ के साथ अभिव्यक्ति लिखता हूं। मुझे यह काफी प्राकृतिक और पठनीय लगता है, लेकिन मैंने कभी-कभी इसे खराब रूप से पढ़ा है और यह समझ में नहीं आता कि यह क्यों होना चाहिए।

+7

क्या आपके पास कोई संदर्भ है जहां इसे खराब रूप के रूप में वर्णित किया गया है? – bobbymcr

+0

संक्षिप्त उत्तर: नहीं। –

उत्तर

22

निम्नलिखित सभी अच्छे फार्म हैं:

foo = bar . baz . quux 
foo x = bar . baz . quux $ x 
foo x = (bar . baz . quux) x 
foo x = bar (baz (quux x)) 

मैं उन्हें अपने वरीयता के किसी न किसी क्रम में डाल दिया है, हालांकि हमेशा की तरह स्वाद बदलता है, और संदर्भ एक अलग विकल्प की मांग कर सकते हैं। मैं भी कभी-कभी

foo = bar 
    . baz 
    . quux 

देखा है जब bar, baz, और quux subexpressions से प्रत्येक लंबे होते हैं। निम्नलिखित खराब फॉर्म है:

foo x = bar $ baz $ quux $ x 

दो कारण हैं जो कम बेहतर हैं। सबसे पहले, कम subexpressions की प्रतिलिपि बनाई जा सकती है और refactoring के दौरान एक सहायक परिभाषा में चिपकाया जा सकता है; सभी ($) ऑपरेटरों के साथ, x तर्क में केवल उप-अभिव्यक्तियां वैध रेफैक्टरिंग हैं, जबकि (.) और ($) ऑपरेटरों के साथ bar . baz या baz . quux जैसे उप-अभिव्यक्तियों को भी एक अलग परिभाषा में खींचा जा सकता है।

(.) को प्राथमिकता देने का दूसरा कारण ($) की स्थिरता में संभावित परिवर्तन की प्रत्याशा में है; वर्तमान में, ($)infixr है, जिसका अर्थ यह सही करने के लिए एकत्रित करती है, इसलिए जैसे:

foo x = bar $ (baz $ (quux $ x)) 

हालांकि, ($) अधिक भाव में उपयोगी अगर यह infixl थे हो सकता है; उदाहरण के लिए,

foo h = f (g x) (h y) 
foo h = f $ g x $ h y 
foo h = (f $ g x) $ h y 

... जो वर्तमान में कोष्ठक के बिना व्यक्त नहीं किया जा सकता है। "बुरा फार्म" उदाहरण है, जब एक infixl आवेदन के साथ पार्स,

foo x = ((bar $ baz) $ quux) $ x 

जो कुछ काफी अलग अर्थ है किया जाएगा। तो, इस फॉर्म से बचकर भविष्य में सबूत साबित करें।

+6

मैंने कभी-कभी 'बार' जैसी चीज़ों को भी देखा है। baz $ quux x' या 'bar (baz। quux $ x)' या अन्य मिश्रण, आमतौर पर जब अन्य इंफिक्स ऑपरेटर शामिल होते हैं, या जब विशिष्ट फ़ंक्शन अनुप्रयोगों को अवधारणात्मक रूप से जोर दिया जाता है। –

+6

आईएमओ, फिक्सिटी तर्क इस तथ्य से कम आकर्षक है कि रचनात्मक शैली आपको पाइपलाइन को एक साधारण कट-एंड-पेस्ट के साथ एक फ़ंक्शन में दोबारा करने की सुविधा देती है। – ehird

+0

इसकी वर्तमान स्थिरता के साथ, यदि आपके पास 'bar $ baz $ quux $ x' है, तो यह' बार के बराबर है। बाज़ quux $ x'। उत्तरार्द्ध, निश्चित रूप से, पूर्व पर प्रोत्साहित किया जाता है। –

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