haskell - क्या शैक्षणिक उपयोग से बाहर जारी रखने के लिए एक वास्तविक दुनिया का प्रयोज्यता है?




f# monads (2)

"सभी मोनादों की मां" सामान पूरी तरह अकादमिक नहीं है। डेन पिपोनी ने एंड्रजज फिलिन्स्की के प्रतिनिधि मोनाद का उल्लेख किया है , एक अच्छा पेपर इसका नतीजा यह है कि अगर आपकी भाषा निरंतरता को सीमांकित करती है (या उन्हें call/cc और अस्थिरता के एक टुकड़े के साथ नकल कर सकते हैं), तो आप पारदर्शी किसी भी कोड को किसी भी मौद्रिक प्रभाव को जोड़ सकते हैं। दूसरे शब्दों में, यदि आपने निरंतरताओं को सीमांकित किया है और कोई अन्य दुष्प्रभाव नहीं दिया है, तो आप (ग्लोबल) मिटबल स्टेट या अपवाद या गैर-नियतिवाद या सहकारी संगामिति को पीछे कर सकते हैं। आप केवल कुछ कार्यों को परिभाषित करके इनमें से प्रत्येक कर सकते हैं कोई वैश्विक परिवर्तन या कुछ भी ज़रूरत नहीं है इसके अलावा, आप केवल उन दुष्परिणामों के लिए भुगतान करते हैं, जिनका उपयोग आप करते हैं। यह पता चला कि घोटाले call/cc अत्यधिक अभिव्यंजक होने के बारे में पूरी तरह सही थे।

यदि आपकी भाषा में सीमांकित प्रारम्भिकता नहीं है, तो आप उन्हें निरंतर मोनद के माध्यम से प्राप्त कर सकते हैं (या दोबारा बैरल निरंतर जारी रखने वाले मोनद)। बेशक, अगर आप मोनैडाइक-स्टाइल में लिख रहे हैं - जो कि एक वैश्विक परिवर्तन है - क्यों न सिर्फ वांछित मोनद का इस्तेमाल करते हैं? हास्केलर्स के लिए, यह आम तौर पर हम क्या करते हैं, हालांकि, कई मामलों में निरंतरता वाले मोनद का उपयोग करने से लाभ (यद्यपि छिपा हुआ हो) हो सकता है। एक अच्छा उदाहरण Maybe / Option मोनद जो अपवादों की तरह है, सिवाय इसके कि केवल एक प्रकार का अपवाद है असल में, यह मोनाद "त्रुटि कोड" लौटने और प्रत्येक फंक्शन कॉल के बाद जांचने के पैटर्न को कैप्चर करता है। और यह वास्तव में क्या है, "फ़ंक्शन कॉल" को छोड़कर, सामान्य परिभाषा क्या है, मेरा मतलब है अभिकलन के हर (मौद्रिक) चरण। कहने के लिए पर्याप्त है, यह बहुत अक्षम है, खासकर जब अधिकांश समय में कोई त्रुटि नहीं होती है यदि आप Maybe निरंतरता वाले मोनद में प्रतिबिंबित करते हैं, जबकि आपको सीपीएसईड कोड (जो जीएचसी हास्केल अच्छी तरह से अच्छी तरह से संभालती है) की लागत का भुगतान करना पड़ता है, तो आप केवल उन स्थानों पर "त्रुटि कोड" को चेक करने के लिए भुगतान करते हैं, जहां यह मामला है, यानी catch बयान हास्केल में, Codensity मुकाबले Codensity मोनद एक बेहतर विकल्प है क्योंकि आखिरी चीज हस्केलर्स को ऐसा करना है ताकि मनमाना प्रभाव उनके कोड में पारस्परिक रूप से हस्तलिखित हो।

जैसा कि डानिडीज ने भी उल्लेख किया है, कई मोनादों को अनिवार्य रूप से एक निरंतरता मोनाद या कुछ प्रकार के उपयोग से अधिक आसानी से या अधिक कुशलतापूर्वक कार्यान्वित किया जाता है। बैक ट्रैकिंग खोज एक उदाहरण है। बैक ट्रैकिंग पर सबसे नई चीज नहीं है, मेरे पसंदीदा पेपर्स में से एक यह है कि हास्केल में लॉजिकल वेरिएबल टाइप किया गया था। वायर्ड हार्डवेयर वर्णन भाषा में उसमें इस्तेमाल की जाने वाली तकनीकों का उपयोग भी किया गया था। Koen Claesson से भी एक गरीब आदमी की Concurrency Monad है । इस उदाहरण में विचारों के और आधुनिक उपयोगों में शामिल हैं: हास्केल ए मोनाद फॉर डिटिमिनेस्टिक समानतावाद और स्केलेबल आई / ओ प्रबंधक के लिए निर्धारणीय समानांतरता के लिए स्केलेबल नेटवर्क सर्विसेज के लिए घटनाक्रम और थ्रेड्स का संयोजन । मुझे यकीन है कि मैं स्काला में इसी तरह की तकनीकों का इस्तेमाल कर सकता हूं यदि यह प्रदान नहीं किया गया था, तो आप एफ # में अतुल्यकालिक वर्कफ़्लो को कार्यान्वित करने के लिए निरंतरता का उपयोग कर सकते हैं। वास्तव में, डॉन सिमेई का संदर्भ उसी वही कागजात पर है जो मैंने अभी संदर्भित किया है। यदि आप फ़ंक्शन को सीरियल कर सकते हैं लेकिन जारी रखने की आवश्यकता नहीं है, तो आप उन्हें प्राप्त करने के लिए निरंतरता का उपयोग कर सकते हैं और सीरसाइड जैसी प्रणालियों के द्वारा बनाई जाने वाली सीरियल की गई निरंतरता वाले वेब प्रोग्रामिंग कर सकते हैं। यहां तक ​​कि सीरिजलाइज करने योग्य जारी रहने के बावजूद, आप स्थानीय रूप से जारी रखने के दौरान कॉलबैक से बचने के लिए पैटर्न (मूलतः एसिंक के समान) का उपयोग कर सकते हैं और केवल एक कुंजी भेजते समय

अंततः, हास्केलर के बाहर अपेक्षाकृत कम लोग किसी भी क्षमता वाले मोनादों का उपयोग कर रहे हैं, और जैसा कि मैंने पहले की ओर संकेत दिया था, होस्केलर लगातार जारी रखने वाले monad की तुलना में अधिक पारस्परिक मानदंडों का उपयोग करना चाहते हैं, हालांकि वे आंतरिक रूप से बहुत कुछ उपयोग करते हैं इसके बावजूद, सतत मुनाफे या चीजों की तरह निरंतरता, विशेष रूप से अतुल्यकालिक प्रोग्रामिंग के लिए, कम असामान्य होते जा रहे हैं। सी #, एफ #, स्काला, स्विफ्ट, और यहां तक ​​कि जावा ने समर्थन मोनैडिक या कम से कम मोनैडिक-स्टाइल प्रोग्रामिंग को शामिल करना शुरू कर दिया है, इन विचारों को अधिक व्यापक रूप से इस्तेमाल किया जाएगा यदि नोड डेवलपर्स इस के साथ अधिक जानकार थे, तो शायद उन्हें एहसास होता कि आप अपना केक भी कर सकते हैं और इसे ईवेंट-आधारित प्रोग्रामिंग के संबंध में भी खा सकते हैं।

(बाद में विज़िटर: इस प्रश्न के दो उत्तर दोनों उत्कृष्ट अंतर्दृष्टि प्रदान करते हैं, यदि आप रुचि रखते हैं तो आपको उन्हें दोनों पढ़ना चाहिए, मैं केवल एक को छोड़कर केवल एक के रूप में)

सभी विचार-विमर्शों से मैं निरंतरता वाले मौकों पर ऑनलाइन खोज करता हूं, या तो वे कुछ तुच्छ उदाहरणों के साथ इसका इस्तेमाल करने का उल्लेख कर सकते हैं, या वे यह समझाते हैं कि यह एक मौलिक निर्माण खंड है, क्योंकि सभी लेखों की मां पर इस लेख में निरंतरता है

मुझे आश्चर्य है कि इस श्रेणी के बाहर प्रयोज्यता है या नहीं। मेरा मतलब है, क्या यह एक पुनरावर्ती समारोह को लपेटने का मतलब है, या निरंतरता वाले मॉनड में आपसी पुनरावृत्ति? क्या यह पठनीयता में सहायता करता है?

इस SO पोस्ट से लिया गया निरंतरता मोड का एक F # संस्करण है:

type ContinuationMonad() =
    member this.Bind (m, f) = fun c -> m (fun a -> f a c)
    member this.Return x = fun k -> k x

let cont = ContinuationMonad()

क्या यह केवल अकादमिक हित के लिए है, उदाहरण के लिए मोनादों को समझने में मदद करने के लिए, या अभिकलन बिल्डरों? या क्या कुछ वास्तविक दुनिया प्रयोज्यता है, टाइप-सुरक्षा जोड़ा गया है या क्या यह विशिष्ट प्रोग्रामिंग समस्याएं खारिज करती हैं जो अन्यथा हल करने के लिए कठिन हैं?

यानी, रयान रिले से कॉल / सीसी के साथ जारी रखने वाले मॉनाड से पता चलता है कि अपवादों को संभालना जटिल है, लेकिन यह यह समझा नहीं देता कि यह समस्या हल करने की क्या कोशिश कर रही है और उदाहरणों में यह नहीं दिखाया जाता है कि इसे विशेष रूप से इस मोनद की आवश्यकता क्यों है। बेशक, मैं समझ नहीं पाया कि यह क्या करता है, लेकिन यह एक खजाना निधि हो सकता है!

(ध्यान दें: मुझे यह समझने में कोई दिलचस्पी नहीं है कि निरंतरता मोनाद कैसे काम करता है, मुझे लगता है कि मुझे इसकी सही समझ है, मुझे यह नहीं पता कि प्रोग्रामिंग समस्या किस प्रकार हल करती है।


एक और सीधा एफ # -निर्वाचित उत्तर प्रदान करने के लिए (भले ही डेरेक ने पहले ही उसको कवर किया हो), निरंतरता मोनाद बहुत ज्यादा कैसे अतुल्यकालिक वर्कफ़्लो काम करता है

एक निरंतरता मोनाद एक ऐसा कार्य है, जिसे निरंतरता दिया जाता है, अंत में परिणाम के साथ निरंतर कॉल करता है (यह कभी इसे कॉल नहीं कर सकता है या यह बार-बार भी इसे बुला सकता है):

type Cont<'T> = ('T -> unit) -> unit

एफ # अतुल्यकालिक कम्प्यूटेशंस थोड़े अधिक जटिल हैं - वे निरंतरता (सफलता के मामले में), अपवाद और रद्दीकरण निरंतरता को लेते हैं और रद्दीकरण टोकन भी शामिल करते हैं। थोड़ा सरलीकृत परिभाषा का प्रयोग करना, एफ # कोर पुस्तकालय का उपयोग करता है ( पूर्ण परिभाषा यहां देखें ):

type AsyncParams =
    { token : CancellationToken
      econt : exn -> unit
      ccont : exn -> unit } 

type Async<'T> = ('T -> unit) * AsyncParams -> unit

जैसा कि आप देख सकते हैं, अगर आप AsyncParams उपेक्षा AsyncParams , तो यह बहुत ही निरंतरता मोनद है एफ # में, मुझे लगता है कि "शास्त्रीय" मोनाद प्रत्यक्ष कार्यान्वयन तंत्र के मुकाबले प्रेरणा के रूप में अधिक उपयोगी होते हैं। यहाँ, निरंतरता मोनैड कुछ प्रकार के कम्प्यूटेशंस को कैसे नियंत्रित करने का एक उपयोगी मॉडल प्रदान करता है - और कई अतिरिक्त एसिंक-विशिष्ट पहलुओं के साथ, मूल विचार का उपयोग अतुल्यकालिक कम्प्यूटेशंस को लागू करने के लिए किया जा सकता है।

मुझे लगता है कि यह क्लासिक शैक्षिक कार्यों में या हास्केल में कैसे उपयोग किया जाता है, जहां वे "जैसा है" का इस्तेमाल करते हैं और शायद अधिक जटिल मोनडों के निर्माण के लिए कई तरह से रचना करते हैं जो कि अधिक जटिल व्यवहार को कैप्चर करते हैं।

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





computation-expression