2016-01-31 5 views
10

पूर्ण आलस्य repeatedly demonstrated किया गया है cause space leaks करने के लिए।पूर्ण आलस्य क्यों एक डिफ़ॉल्ट अनुकूलन है?

-O से आगे आलसी क्यों है? मैं खुद को एसपीजे के The Implementation of Functional Programming Languages में तर्क से असहज महसूस करता हूं। दावा है कि में

f = \y -> y + sqrt 4 

sqrt 4 अनावश्यक रूप से हर बार f दर्ज किया गया है दोहराया है तो हम लैम्ब्डा के बाहर उसमें बदलाव करना चाहिए। मैं छोटे से सहमत हूं, लेकिन चूंकि हमने देखा है कि इस परिवर्तन में बड़ी समस्याएं क्या हैं, मुझे विश्वास नहीं है कि यह इसके लायक है। ऐसा लगता है कि इस परिवर्तन के लाभ एकतरफा रूप से उपलब्ध हैं ** केवल स्थानीय कोड परिवर्तन और प्रोग्रामर जो इसे चाहते हैं इसे हाथ से लागू करना चाहिए।

क्या आप मुझे अन्यथा मनाने के लिए कर सकते हैं? full-laziness वास्तव में वास्तव में उपयोगी है? मुझे विशेष रूप से आश्वस्त किया जाएगा यदि आप हाथों को लागू करने के लिए उदाहरण प्रदान कर सकते हैं जो बहुपक्षीय सहयोग या गैर-स्थानीय परिवर्तनों की आवश्यकता है।

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

** बदलता है

+1

'पूर्ण आलस्य' ट्रांसफॉर्मेशन में वास्तव में मूल्यांकन आदेश के साथ कुछ भी नहीं है। उदाहरण के लिए –

उत्तर

7

कम से कम एक मामले ऐसे पूर्ण आलस्य "सुरक्षित" है और एक अनुकूलन है ।

g :: Int -> Int 
g z = f (z+1) 
    where f 0 = 0 
     f y = 1 + f (y-1) 

यह वास्तव में g = \z -> let {f = ...} in f (z+1) का अर्थ है और, कि जिस तरह से संकलित, यह कॉल करने से पहले f के लिए एक बंद आवंटित करेगा। जाहिर है कि मूर्ख है, और जहां कोई आवंटन g_f कॉल करने के लिए की जरूरत है संकलक

g_f 0 = 0 
g_f y = 1 + g_f (y-1) 
g z = g_f (z+1) 

में कार्यक्रम बदलना चाहिए। खुशी से पूर्ण आलस्य परिवर्तन वास्तव में करता है।

जाहिर प्रोग्रामर इन स्थानीय परिभाषाओं कि उच्च-स्तरीय समारोह के तर्कों पर निर्भर नहीं है करने से बचना सकता है, लेकिन इस तरह के परिभाषाएँ आम तौर पर अच्छा शैली माना जाता है ...

एक और उदाहरण:

h :: [Int] -> [Int] 
h xs = map (+1) xs 

इस मामले में आप केवल ईटा को कम कर सकते हैं, लेकिन आम तौर पर आप कम नहीं कर सकते हैं। और फ़ंक्शन नामकरण (+1) काफी बदसूरत है।

+0

धन्यवाद। वही लागू होगा यदि 'एफ' 'इंट' था, खासकर यदि इसकी गणना करना महंगा है। हालांकि, मैं कम हिंसक परिवर्तन के बारे में सोच रहा था: 'g = let {f = ...} \ z -> f (z + 1) 'में। यह अभी भी अच्छी शैली माना जाएगा जो मुझे लगता है, भले ही यह हास्केल के 'कहां' के साथ अच्छी तरह से व्यवस्थित रूप से फिट न हो। –

+0

आपका दूसरा उदाहरण, 'एच', अधिक भरोसेमंद है क्योंकि' (+1) 'नाम देने से वास्तव में काफी बदसूरत है। मैं एसपीजे के उदाहरण के बराबर होने के रूप में इसका आकलन करता हूं 'वर्ग 4' के साथ। मुझे लगता है कि मेरा निष्कर्ष तब है कि 'पूर्ण आलस्य' आपको हजारों कटौती से मौत से बचाता है। एक सिद्धांत रूप से अनुकूलित संस्करणों को हाथ से उत्पन्न कर सकता है लेकिन यह हर जगह ऐसा करने में अक्षम होगा। –

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