7

मैं लोगों को के बारे में बात करते हुए देखता हूं आपके बॉयलरप्लेट और जेस्किक प्रोग्रामिंग हास्केल में स्क्रैप करें। इन शब्दों का मतलब क्या है? मैं स्क्रैप आपके बॉयलरप्लेट का उपयोग कब करना चाहता हूं, और मैं इसका उपयोग कैसे करूं?"आपका बॉयलरप्लेट स्क्रैप" क्या है?

+1

Google पर इस पर दस्तावेज का एक टन है .... –

+3

@ जस्टिन पिहनी मैंने सवाल पूछा क्योंकि स्टैक ओवरफ़्लो के उद्देश्य में से एक * सभी * प्रोग्रामिंग सवालों का जवाब है, [यहां तक ​​कि जिन्हें भी गुगल किया जा सकता है] (http://meta.stackexchange.com/questions/5280/embrace-the-non-googlers)। यह प्रश्न, जहां तक ​​मैं देख सकता हूं, पहले कभी एसओ पर नहीं पूछा गया है, और मुझे विश्वास है कि यह कुछ उच्च गुणवत्ता वाले उत्तरों उत्पन्न करेगा। –

+0

पेपर की धारा 2 [अपने बॉयलरप्लेट को स्क्रैप करें - जेनेरिक प्रोग्रामिंग के लिए एक प्रैक्टिकल डिज़ाइन पैटर्न] (http://citeseerx.ist.psu.edu/viewdoc/download;jsessionid=0088DE3D75D657BE9F2B9E5D705232B3?doi=10.1.1.1.3176&rep=rep1&type= पीडीएफ) में एक अच्छा प्रेरक उदाहरण है। – ErikR

उत्तर

7

अक्सर जटिल डेटा प्रकारों में परिवर्तन करते समय, हमें केवल संरचना के छोटे टुकड़ों को प्रभावित करने की आवश्यकता होती है --- दूसरे शब्दों में, हम अकेले विशिष्ट कमजोर अभिव्यक्तियों, रेडएक्स को लक्षित कर रहे हैं।

क्लासिक उदाहरण पूर्णांक भाव का एक प्रकार से अधिक डबल निषेध उन्मूलन है:

data Exp = Plus Exp Exp | Mult Exp Exp | Negate Exp | Pure Int 

doubleNegSimpl :: Exp -> Exp 
doubleNegSimpl (Negate (Negate e)) = e 
... 

यहां तक ​​कि इस उदाहरण का वर्णन करने में, मैं ... भाग की सम्पूर्णता को लिखने के लिए नहीं करना चाहते। यह पूरी तरह से यांत्रिक है --- Exp की पूरी तरह से रिकर्सन जारी रखने के लिए इंजन से अधिक कुछ नहीं।

यह "इंजन" बॉयलरप्लेट है जिसे हम स्क्रैप करना चाहते हैं।


इस लक्ष्य को पूरा स्क्रैप आपका बॉयलरप्लेट एक व्यवस्था है जिसके द्वारा हम डेटा प्रकार से अधिक "सामान्य traversals" का निर्माण कर सकते पता चलता है। ये ट्रैवर्सल विशिष्ट डेटा प्रकार के बारे में कुछ भी जानने के बिना बिल्कुल सही तरीके से काम करते हैं। ऐसा करने के लिए, बहुत मोटे तौर पर, हमारे पास सामान्य एनोटेटेड पेड़ की धारणा है।

section :: Generic a => a -> AnnotatedTree 

और "वैध" एनोटेट पेड़ एडीटी

की
retract :: Generic a => AnnotatedTree -> Maybe a 
कुछ ब्रांड में वापस अनुमान किया जा सकता है: ये इस तरह से ADTS कि सभी ADTS एनोटेट पेड़ के प्रकार में प्रक्षेपित किया जा सकता से बड़े होते हैं

विशेष रूप से, मैं Generic टाइपक्लास को section और retract परिभाषित करने वाले प्रकारों को इंगित करने के लिए शुरू कर रहा हूं।

सभी सामान्य प्रकार के इस सामान्य, एनोटेटेड पेड़ का प्रतिनिधित्व करते हुए, हम एक बार और सभी के लिए एक ट्रैवर्सल परिभाषित कर सकते हैं। विशेष रूप से, हम एक इंटरफ़ेस प्रदान करते हैं (section और retract रणनीतिक रूप से उपयोग करते हुए) ताकि अंतिम उपयोगकर्ता AnnotatedTree प्रकार से कभी संपर्क न करें।

everywhere' :: Generic a => (a -> a) -> (AnnotatedTree -> AnnotatedTree) 

ऐसा है कि, और अंतिम और प्रारंभिक section और retract रों के साथ संयुक्त अपरिवर्तनीय है कि हमारे एनोटेट पेड़ हमेशा "वैध" हैं, हम

everywhere :: Generic a => (a -> a) -> (a -> a) 
everywhere f a0 = fromJust . retract . everywhere' f . section 

है: इसके बजाय, यह एक बिट की तरह दिखता है

everywhere f a क्या करता है? यह ADT a में फ़ंक्शन f "हर जगह" लागू करने का प्रयास करता है। दूसरे शब्दों में, हम अब हमारे डबल निषेध सरलीकरण के रूप में

doubleNegSimpl :: Exp -> Exp 
doubleNegSimpl (Negate (Negate e)) = e 
doubleNegSimpl e     = e 

दूसरे शब्दों में इस प्रकार है, लिखना जब भी redex (Negate (Negate _)) मिलान करने के लिए विफल रहता है यह id के रूप में कार्य करता है। अगर हम इस

simplify :: Exp -> Exp 
simplify = everywhere doubleNegSimpl 

तो डबल negations को everywhere लागू एक सामान्य ट्रेवर्सल के माध्यम से "हर जगह" का सफाया कर दिया जाएगा।... बॉयलरप्लेट चला गया है।

+0

को बदलने का प्रयास कर रहा है, 'हर जगह' यह पता लगाता है कि कोई पैटर्न सफलतापूर्वक मेल खाता है या नहीं? आम तौर पर, गैर-संपूर्ण पैटर्न एक अपवाद फेंकते हैं जिसे 'आईओ' में पकड़ा जाना चाहिए। –

+0

यह नहीं करता है। 'doubleNegSimpl' पहचान है जब रेडएक्स मेल नहीं खाता है, इसलिए' हर जगह 'सचमुच बस इसे * हर जगह * लागू करता है और यह ज्यादातर स्थानों में एक नो-ऑप है। बेशक, 'हर जगह' इसे कुशलता से करने के लिए सावधान है। –

+0

ओह, ज़ाहिर है। मैं स्पष्ट रूप से ध्यान से पढ़ नहीं रहा था;) –

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