2017-04-09 8 views
5

Rewrite rules साथ नियम पुनर्लेखन अपने कार्यक्रम अनुकूलन के साथ कर सकते हैं। और मुझे आश्चर्य है कि अगर वे newtype में अपनी ऑब्जेक्ट्स लपेटते हैं तो वे काम करेंगे। के रूप में यह जाना जाता है, newtype प्रदर्शन दंड लाने नहीं है, यह एक संकलन समय आवरण जो रनटाइम पर चला गया है है। इसलिए मुझे आश्चर्य है कि फिर से लिखने के नियम newtype के साथ ट्रिगर किए जाएंगे। उदाहरण के लिए, वहाँ Data.Text (What is fusion in Haskell?) के लिए नियमों का एक बहुत कर रहे हैं।newtype

GHC वर्तमान में एक अभिव्यक्ति के साथ एक नियम एलएचएस मिलान के लिए एक बहुत ही सरल, वाक्यात्मक, मिलान एल्गोरिथ्म का उपयोग करता:

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

और अब मैं Identity Text (कुछ कारणों से) के साथ काम कर रहा हूं। क्या मुझे अभी भी उन प्रदर्शन लाभ मिलेगा? मैं अपने द्वारा बेंचमार्क करने और उनके परिणामों में सुनिश्चित करने के लिए नियमों को फिर से लिखने में एक विशेषज्ञ नहीं हूं।

+2

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

उत्तर

6

पुनर्लेखन नियम (और नहीं हास्केल के लिए) GHC के मध्यवर्ती भाषा कोर करने के लिए लागू कर रहे हैं। उस समय तक, newtype अधिकतर गायब हो गए हैं। उदाहरण के लिए, Identity xx |> c हो जाता है जहां c एक बलात्कार है कि डालेx :: Text प्रकार Identity Text के बारे में कुछ में।

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

दुर्भाग्य से, वहाँ कोई ठोस गारंटी देता है, और मध्यवर्ती कोड (और ज्ञात क्या देखने के लिए, उदाहरण के लिए यदि आप एक निश्चित जगह है जहाँ संलयन हो जाता है पता है) की ओर देखे बिना आप यह सुनिश्चित करें कि Identity का उपयोग नहीं करता है नहीं किया जा सकता यहां एक कीमत पर आओ।

+0

बहुत बहुत धन्यवाद! मैं कुछ बेंचमार्क देखने की उम्मीद कर रहा था लेकिन इस तरह के स्पष्टीकरण मेरे लिए पहले से ही अच्छा है। – Shersh

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