2010-10-05 5 views
5

मैं एक हास्केल ट्यूटोरियल पढ़ रहा था (आपको एक हास्केल सीखें) जिसमें लेखक ने कहा था कि आलस्यता पारदर्शी पारदर्शिता के साथ अच्छी तरह से चलती है। अधिक पढ़ने और कुछ खोज करने के बाद, मुझे अभी भी समझ में नहीं आता क्यों। ध्यान दें कि मैं समझता हूं कि रेफरेंसियल पारदर्शिता और आलस्य के बारे में क्या बढ़िया है, लेकिन यह एक साथ है जो मुझे परेशान कर रहा है।आभासी पारदर्शिता के साथ आलस्य क्यों अच्छी तरह से जाती है?

क्या दोनों के संयोजन का कोई विशेष लाभ है?

या शायद लेखक सिर्फ यह कहना चाहते थे कि वे दोनों अच्छे हैं और अस्पष्ट रूप से व्यक्त किए गए हैं?

उत्तर

11

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

long start = System.currentTimeMillis(); //get the start time 
runBenchmarkFunction(); 
System.out.println("Run took " + (System.currentTimeMillis() - start) + " ms"); 

अब एक आलसी भाषा, पहली पंक्ति के evalutation स्थगित होगा क्योंकि शुरुआत केवल तीसरी पंक्ति के लिए आवश्यक है। तो परिणाम 0 होगा (या इसके बहुत करीब)। शायद वह नहीं है जो आप चाहते हैं। उस परेशानी का कारण यह होगा कि System.currentTimeMillis संदर्भित पारदर्शी नहीं है। आपको उस मामले में कोई समस्या नहीं होगी यदि यह पाप या एलएन जैसे "गणितीय अर्थ" में एक फ़ंक्शन था, जो संदर्भित पारदर्शी हैं।

+1

"राज्य केवल तीसरी पंक्ति में जरूरी है"। यह सख्ती से सच नहीं है। दूसरी लाइन चलाने के लिए वर्तमान समय के लिए सिस्टम से पूछने के दुष्प्रभाव की आवश्यकता है; यह 'आईओ ए' प्रकार है, न कि 'ए'। runBenchmarkFunction समान प्रकार का है, और दोनों को चलाने के लिए, आपको उन्हें कुछ फ़ंक्शन के साथ जोड़ना होगा जो सुनिश्चित करता है कि कार्य Haskell में '>>' क्रम में किया जाता है। तो आप वास्तव में 'currentTime >> = \ st -> runBenchmarkFunction >> currentTime >> = \ end -> putStrLn "इसे लिया" ++ ($ end - st) ++ "सेकंड" दिखाएं। स्पष्ट रूप से दूसरी पंक्ति पहले पर निर्भर करती है, इसलिए यह सब काम करता है। – jrockway

+0

@ ज्रॉकवे: मैं यहां एक काल्पनिक भाषा का उपयोग कर रहा हूं जिसे आप आलसी और संदर्भित पारदर्शिता के बीच संबंधों को समझाने के लिए "आलसी जावा" को एक बहुत ही कच्चे और आसान उदाहरण के रूप में कॉल कर सकते हैं। हास्केल में समस्या का समाधान कैसे किया जाता है ** एक ** पूरी तरह से अलग ** प्रश्न है। ध्यान दें कि हास्केल का "मोनड का तरीका" एकमात्र संभावना नहीं है, उदा। इस समस्या से निपटने के लिए स्वच्छ अपने प्रकार के सिस्टम का उपयोग करता है। – Landei

+1

प्रश्न "हैकसेल" टैग किया गया है। लेकिन फिर भी, यदि आपने सही अर्थशास्त्र की कल्पना की है तो आपने जो लिखा है वह पूरी तरह से पारदर्शी रूप से पारदर्शी है। और, यदि आप अन्य अर्थशास्त्र की कल्पना करते हैं, तो यह नहीं है। लेकिन कुंजी शब्द "कल्पना" है। – jrockway

5

संदर्भित पारदर्शिता का अर्थ है कि फ़ंक्शन हमेशा एक ही इनपुट को उसी इनपुट को वापस कर देगा। तो अगर कोई फर्क नहीं पड़ता कि समारोह आलसी या सख्त है। आलसी कार्य भविष्य में किसी अज्ञात समय पर अपने आउटपुट की गणना करेगा लेकिन संदर्भित पारदर्शिता के कारण आपको गारंटी दी जाती है कि आउटपुट हमेशा दिए गए इनपुट के लिए समान होगा।

तो एक तरह से, रेफरेंसियल पारदर्शिता आलसी कार्यों की शुद्धता का आश्वासन देती है।

4

इस पायथन कोड पर विचार करें, जहां एक जेनरेटर का उपयोग अनंत अनुक्रम की आलस्य गणना करने के लिए किया जाता है। वैश्विक स्थिति के उपयोग के कारण इसकी कोई पारदर्शी पारदर्शिता नहीं है, इसलिए जनरेटर का एक कॉलर यह सुनिश्चित नहीं कर सकता है कि वे जो परिणाम प्राप्त कर रहे हैं वह किसी अन्य घटना से प्रभावित नहीं हुआ है।

foo = 0 

def foo_sequence(): 
    global foo 
    while True: 
     foo += 1 
     yield foo 

>>> generator = foo_sequence() 
>>> generator.next() 
1 
>>> generator.next() 
2 
>>> foo = 5 
>>> generator.next() 
6 

इस मामले में, कॉलर ऐसी घटनाओं को रोकने के लिए परमाणु रूप से संपूर्ण अनुक्रम उत्पन्न करना पसंद करेंगे। इसलिए, रेफरेंसियल पारदर्शिता की कमी (इस प्रदूषित उदाहरण में) आलस्य को अवांछित बनाता है।

+0

बहुत अच्छा उदाहरण।बेशक हास्केल में भी रेफरेंसियल पारदर्शिता तोड़ना संभव है, हालांकि आमतौर पर रास्ते में चेतावनी संकेत होते हैं। –

+0

@ जॉन: आपका मतलब प्राचीन सामग्री या 'असुरक्षितफॉर्मियो' का उपयोग करने के साथ है? अगर सही ढंग से उपयोग नहीं किया जाता है तो इन्हें हानिकारक माना जाता है। एक और तरीका कल्पना नहीं कर सकता। – fuz

+0

@FUZxxl, कि वास्तव में है कि मैं क्या मतलब है, और 'unsafe' उपसर्ग चेतावनी होगा। एक और तरीका एक पॉइंटर को बाइटस्ट्रिंग में लपेटना है, फिर पॉइंटर को संशोधित करें। –

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