एक प्रक्रिया के रूप में लागू निरंतरता का एक उदाहरण क्या है?


15

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

विशुद्ध रूप से कार्यात्मक भाषा में (जहां सभी कार्य शुद्ध और प्रथम श्रेणी के नागरिक हैं), मुझे लगता है कि एक निरंतरता पूरी तरह से एक फ़ंक्शन के रूप में तैयार की जा सकती है। यह, आखिरकार, मैंने पहले से ही इस बिंदु तक निरंतरता को कैसे समझा है। हालांकि, दुनिया राज्य से भरी हुई है (आह ..) और इसलिए सामान्य परिभाषा की आवश्यकता नहीं है कि एक निरंतरता पर कब्जा कार्यक्रम राज्य - इसे केवल आशय को पूरा करने की आवश्यकता है।

मेरी समझ में मदद करने के लिए, एक उदाहरण एक कार्यात्मक भाषा में प्रदान किया जा सकता है जहां एक फ़ंक्शन की तुलना में निरंतरता अधिक सार तरीके से व्यक्त की जाती है? मुझे पता है कि योजना आपको प्रथम श्रेणी के तरीके (कॉल / सीसी) में वर्तमान निरंतरता को हथियाने की अनुमति देती है, लेकिन फिर भी, ऐसा लगता है कि कॉल करने के लिए पारित एक तर्क प्रक्रिया / सीसी को बस एक और के रूप में वर्तमान निरंतरता दी गई है तर्क प्रक्रिया जिस पर कॉल / cc'd फ़ंक्शन अपना परिणाम लागू कर सकता है।


शायद महाद्वीपों और विखंडन के अंतर के रूप में: निरंतरता को विचलन के माध्यम से डेटा संरचनाओं में परिवर्तित किया जा सकता है; देखने के लिए एक दिलचस्प क्षेत्र हो सकता है।
दान डी।

@DanD। क्या आपके पास रोचक साहित्य के लिए कोई सुझाव है जिसे मैं पढ़ सकता हूं? यह विषय उपयोगी लगता है।
डेविड काउडन

जवाबों:


11

tl; डॉ; प्रकार एक निरंतरता से अधिक व्यापक अमूर्त है


एक निरंतरता इसके इनपुट और आउटपुट का प्रकार है

एक गैर-प्रक्रिया आधारित निरंतरता के लिए निकटतम चीज आपको हास्केल में निरंतरता की संभावना है क्योंकि यह एक प्रकार के रूप में व्यक्त किया जाता है, जिसके लिए कई कार्यों का उपयोग प्रकार के साथ बातचीत करने, फिर से शुरू करने, बैकट्रैक, एट अल के लिए किया जा सकता है।

आप उस प्रकार को बंद कर सकते हैं जैसे कि Contहास्केल के प्रकार में जहां आपको "उच्च स्तर के अमूर्त" के रूप में मोनाड अमूर्त मिलता है, और निरंतरता पर अन्य प्रकार के अमूर्त के रूप में मिलते हैं जब आप निरंतरता को एक प्रकार के बजाय एक प्रकार के रूप में देखते हैं। उदाहरण के लिए, एक प्रक्रिया

  • आप दो निरंतरताएं ले सकते हैं और उन दोनों के बीच एक विकल्प कर सकते हैं यदि प्रकार एक मोनॉइड होने के लिए कानूनों का पालन करता है
  • आप कर सकते हैं प्रकार निरंतरता के इनपुट या आउटपुट प्रकार बदलने के लिए अगर आप एक प्रकार है कि एक के कानूनों का पालन करता में बंद संपुटित से अधिक सार functor
  • आप मनमाने ढंग से और आंशिक रूप से अपनी निरंतरता को लागू कर सकते हैं या कार्यक्षमता के साथ सजा सकते हैं जैसे कि इनपुट सत्यापन या इनपुट रूपांतरण यदि आप एक प्रकार में क्लोजर को एन्कैप्सुलेट करते हैं जो एक ऐप्लिकेटर फ़ंक्टर के नियमों का पालन करता है।

प्रक्रिया बनाम प्रक्रिया

दिन के अंत में आप मूल रूप से सही हैं; एक निरंतरता एक "प्रक्रिया" है, हालांकि मैं इसे एक बंद के रूप में संदर्भित करूंगा। अक्सर समय की निरंतरता को प्रथम श्रेणी के बंद होने के रूप में व्यक्त किया जाता है जिसने एक बाध्य वातावरण को घेर लिया है। एक शुद्ध कार्यात्मक भाषा में आप कह सकते हैं कि यह विशेष रूप से उचित नहीं है क्योंकि आपके पास संदर्भों की कमी है; यह सच है, लेकिन आप मूल्यों को संलग्न कर सकते हैं और एकल असाइनमेंट मान बनाम संदर्भ को सटीक बनाता है। यह हास्केल में वृद्धि देता है:

(\x -> \y -> insideYIcanAccess x (and y))

एक ऐसी भाषा जिसमें एक बाध्यकारी वातावरण को घेरने की क्षमता का अभाव है, तकनीकी रूप से प्रथम श्रेणी के बंद होने का अभाव हो सकता है, लेकिन फिर भी कुछ वातावरण (आमतौर पर वैश्विक) है जो बंद करने के लिए उपलब्ध है।

इसलिए मैं कहूंगा कि यह निरंतरता का वर्णन करने के लिए अधिक सटीक है: एक विशेष तरीके से बंद किया जा रहा है।


निष्कर्ष

के प्रश्न के लिए "क्या एक प्रक्रिया के अलावा किसी भी तरह से एक निरंतरता लागू करने योग्य है?" यदि आपके पास प्रथम श्रेणी के कार्य नहीं हैं, तो आप वास्तव में निरंतरता नहीं रख सकते हैं (हां फ़ंक्शन संकेत प्रथम श्रेणी के कार्यों के रूप में गिने जाते हैं, इसलिए वैकल्पिक रूप से मनमाने ढंग से मेमोरी एक्सेस पर्याप्त हो सकती है)।

अब इस सवाल के लिए "क्या किसी प्रक्रिया की तुलना में अधिक सार तरीके से निरंतरता व्यक्त करने के कोई तरीके हैं?" इसे एक प्रकार के रूप में व्यक्त करना आपको बहुत अधिक अमूर्तता प्रदान करता है, जिससे आप बहुत सामान्य तरीकों से निरंतरता का इलाज कर सकते हैं जैसे कि आप इसे निष्पादित करने की तुलना में कई और तरीकों से जारी रख सकते हैं।


1
यह "एक निरंतरता बस कुछ भी हो सकती है जो आपको बाकी कार्यक्रम का परिणाम देती है"। चूंकि यह आम तौर पर कुछ कोड (कार्यक्रम के बाकी) होने का आदेश देता है, इसलिए अधिकांश भाषाएं फ़ंक्शन का उपयोग करती हैं। सैद्धांतिक रूप से आप किसी भी चीज से निरंतरता का निर्माण कर सकते हैं। मेरे संकलक में निरंतर रूपांतरण के दौरान, मैंने आंशिक रूप से भरे हुए पेड़ों का उपयोग किया है।
डैनियल ग्रैज़र

1
आंशिक रूप से भरे हुए पेड़ों पर @jozefg एक अभिव्यक्ति के रूप में एक संगणना का एक उचित प्रतिनिधित्व है, लेकिन दिन के अंत में लिखा जा रहा वास्तविक कोड एक तरह का अभिव्यक्ति है, जो एक प्रक्रिया से अलग-अलग नहीं हो सकता है, जैसे कि मैं इसे समझता हूं। एक तरफ, आंशिक रूप से भरे हुए पेड़ संकलक प्रतिनिधित्व हैं; डेवलपर्स का प्रतिनिधित्व उम्मीद है कि भाषा की वाक्य रचना और शब्दार्थ के साथ एक संगणना अभिव्यक्ति का मानक है, जो 99% डेवलपर्स को "प्रक्रिया", "फ़ंक्शन" या अन्यथा के रूप में दिखाई देगा। आप कंपाइलर डेवलपर के दृष्टिकोण से सोच रहे हैं
जिमी हॉफ

2

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

उदाहरण के लिए, निम्नलिखित पायथन कार्यक्रम पर विचार करें:

def my_iterator():
   yield 1
   yield 2
   yield 3

def main():
   it = my_iterator()
   x = it.next()
   y = it.next()
   z = it.next()
   print x + y + z

स्पष्ट कॉलबैक के साथ निम्न जावास्क्रिप्ट प्रोग्राम के समान इसका प्रकार:

function my_iterator()
  return function(cb1){
    cb1(1, function(cb2){
      cb2(2, function(cb3){
        cb3(3, function(cb4){
          throw "stop iteration";
        });
      });
    });
  });
}

function main(){
   var getNext1 = my_iterator();
   getNext1(function(x, getNext2){
      getNext2(function(y, getNext3){
         getNext3(function(z, getNext4){
            console.log(x + y + z);
         });
      });
   });
}

जावास्क्रिप्ट उदाहरण शोर की तरह है क्योंकि प्रत्येक चरण में उपज मान को वापस करने के अलावा अगले निरंतरता को वापस करने की आवश्यकता होती है (पायथन में इत्ते के अंदर निरंतरता का ट्रैक रखता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.