समवर्ती हास्केल

समवर्ती (कॉन्कररेंट) हास्केल विस्तारित हास्केल 98 स्पष्ट समरूपता के साथ, इसकी दो मुख्य अंतर्निहित अवधारणाएँ हैं:


 * एक आदिम प्रकार  एक बाउंडेड/सिंगल-प्लेस एक्टर मॉडल और प्रोसेस कैलकुली # एसिंक्रोनस चैनल को लागू करना, जो या तो खाली है या टाइप का मान रखता है.
 * के माध्यम से एक समवर्ती थ्रेड (कंप्यूटिंग) उत्पन्न करने की क्षमता  प्राचीन हैं।

इसके ऊपर निर्मित उपयोगी संगामिति और तुल्यकालन सार का एक संग्रह है जैसे कि एक्टर मॉडल (कंप्यूटर विज्ञानं) और प्रक्रिया गणना अतुल्यकालिक चैनल, सेमाफोर (प्रोग्रामिंग) और नमूना चर।

हास्केल थ्रेड्स में बहुत कम ओवरहेड होता है: हास्केल रनटाइम के लिए निर्माण, संदर्भ-स्विचिंग और शेड्यूलिंग सभी आंतरिक हैं। ये हास्केल-स्तरीय धागे ओएस-स्तरीय धागे की कॉन्फ़िगर करने योग्य संख्या पर मैप किए जाते हैं, सामान्यतः प्रति प्रोसेसर कोर में से एक होते हैं।

सॉफ्टवेयर ट्रांजैक्शनल मेमोरी
सॉफ्टवेयर ट्रांजैक्शनल मेमोरी (एसटीएम) एक्सटेंशन ग्लासगो के ग्लासगो हास्केल कंपाइलर समवर्ती हास्केल के फोर्किंग प्रिमिटिव की प्रक्रिया का पुन: उपयोग करता है। एसटीएम हालांकि:


 * टालता है एस के पक्ष में  एस।
 * परिचय देता है  और   प्रिमिटिव, वैकल्पिक परमाणु क्रियाओं को सॉफ्टवेयर ट्रांजैक्शनल मेमोरी # कंपोज़ेबल ऑपरेशंस एक साथ करने की अनुमति देता है।

एसटीएम मोनाड
एसटीएम मोनाड (कार्यात्मक प्रोग्रामिंग) हास्केल में सॉफ्टवेयर ट्रांजैक्शनल मेमोरी का कार्यान्वयन है। यह जीएचसी में लागू किया गया है, और डाटाबेस लेनदेन में परिवर्तनीय चर को संशोधित करने की अनुमति देता है।

पारंपरिक दृष्टिकोण
एक उदाहरण के रूप में बैंकिंग एप्लिकेशन और उसमें एक ट्रांसक्शन्स पर विचार करें - स्थानांतरण फ़ंक्शन, जो एक खाते से पैसा लेता है, और इसे दूसरे खाते में डालता है। IO मोनाड में, यह ऐसा दिखाई दे सकता है: यह समवर्ती स्थितियों में समस्याएँ पैदा करता है जहाँ एक ही समय में एक ही खाते में कई स्थानान्तरण हो सकते हैं। यदि खाते से पैसे ट्रांसफर करने वाले दो स्थानान्तरण होते हैं, और दोनों कॉल को स्थानांतरित करने के लिए लाइन चला गया   इससे पहले कि उनमें से कोई भी अपने नए मूल्यों को लिखे, यह संभव है कि पैसा अन्य दो खातों में डाल दिया जाएगा, जिसमें से केवल एक राशि को खाते से हटा दिया जाएगा।  , इस प्रकार रेस कंडीशन (उच्छृंखल अवस्था) उतपन्न कर रहा है। यह बैंकिंग एप्लिकेशन को असंगत स्थिति में छोड़ देगा।

ऐसी समस्या का पारंपरिक समाधान लॉकिंग है। उदाहरण के लिए, यह सुनिश्चित करने के लिए कि क्रेडिट और डेबिट संपूर्ण या बिलकुल (ऑटोमिकाली) नहीं होते हैं, किसी खाते में संशोधनों के आसपास लॉक लगाए जा सकते हैं। हास्केल में, लॉकिंग MVars के साथ पूरा किया जाता है: इस तरह की प्रक्रियाओं का उपयोग करने से यह सुनिश्चित होगा कि किसी भी व्यक्तिगत खाते में पढ़ने और लिखने के अनुचित इंटरलीविंग के कारण पैसा कभी भी खोया या प्राप्त नहीं होगा। हालाँकि, यदि कोई स्थानांतरण जैसी प्रक्रिया बनाने के लिए उन्हें एक साथ बनाने की कोशिश करता है: एक रेस कंडीशन की स्थिति अभी भी उपस्थित है: पहले खाते को डेबिट किया जा सकता है, फिर थ्रेड का निष्पादन निलंबित किया जा सकता है, खातों को एक असंगत स्थिति में छोड़ दिया जा सकता है। इस प्रकार, समग्र संचालन की शुद्धता सुनिश्चित करने के लिए अतिरिक्त ताले जोड़े जाने चाहिए, और सबसे खराब स्थिति में, किसी दिए गए ऑपरेशन में कितने भी उपयोग किए जाते हैं, इस पर ध्यान दिए बिना किसी को भी सभी खातों को लॉक करने की आवश्यकता हो सकती है।

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

यहां ही  फ़ंक्शन का उपयोग किया गया है, जो एक ट्रांसक्शन्स वापस करेगा और इसे फिर से प्रयास करेगा। एसटीएम में पुन: प्रयास करना स्मार्ट है क्योंकि यह ट्रांसक्शन्स को फिर से चलाने की कोशिश नहीं करेगा जब तक कि ट्रांसक्शन्स के दौरान संदर्भित चरों में से एक को किसी अन्य ट्रांसक्शन्स कोड द्वारा संशोधित नहीं किया गया हो। यह एसटीएम मोनड को काफी कुशल बनाता है।

ट्रांसफर फ़ंक्शन का उपयोग करने वाला एक उदाहरण प्रोग्राम इस तरह दिख सकता है:

जिसे बॉब का बैलेंस: 8000, जिल का बैलेंस: 6000 प्रिंट करना चाहिए। यहां ही  फ़ंक्शन का उपयोग IO मोनाड में STM क्रियाओं को चलाने के लिए किया गया है।