मेरे पास एक फ़ंक्शन है:
test :: string - & gt; स्टेट स्ट्रिंग स्ट्रिंग टेस्ट x = get & gt; & gt; = \ test - & gt; परीक्षा में डालकर 'test = x ++ परीक्षा दें' & gt; & gt; प्राप्त करें & gt; = = test2 - & gt; डाल (test2 ++ x) & gt; & gt; वापसी "परीक्षा"
मुझे इस बात के बारे में बहुत कुछ समझ में आ रहा है कि इस फ़ंक्शन पर क्या चल रहा है, और मैं मोनादों की लटकाने की शुरुआत कर रहा हूं। मुझे समझ में नहीं आ रहा है कि मैं इसे कब चलाता हूं:
रनस्टेट (परीक्षण "परीक्षा") "testtest"
'मिल' फ़ंक्शन 'परीक्षण' में किसी तरह प्रारंभिक राज्य "टेस्टटेस्ट" मिलता है क्या कोई इसे तोड़ सकता है और मुझे समझा सकता है?
मैं किसी भी प्रतिक्रिया की सराहना करता हूं!
कड़ाई से बोलना, प्राप्त करें
कोई तर्क नहीं लेता है। मुझे लगता है कि जो कुछ भी चल रहा है वह जो आप नहीं देख रहे हैं उसे नकाबपोश है - उदाहरण के तौर पर राज्य के मोनद की परिभाषा।
प्राप्त करें
वास्तव में मोनैडास्टेट कक्षा। राज्य मानद MonadState का एक उदाहरण है, प्राप्त करें
:
प्राप्त = स्टेट $ \ s - & gt; दूसरे शब्दों में, मिलता है
बस एक बहुत ही बुनियादी राज्य मोनद (याद रखना कि एक मोनड को "आवरण" के रूप में माना जा सकता है) एक गणना), जहां किसी भी इनपुट s
को गणना में s
की एक जोड़ी परिणाम के रूप में वापस कर देगा। अगली बात हमें देखने की आवश्यकता है & gt; =
है, जो राज्य इस तरह से परिभाषित करता है:
m> gt; & gt; = k = राज्य $ \ s - & gt; RunSTate (का) s '
में रनस्ट्रैट एमएस करें, इसलिए > gt;> =
एक नई गणना उत्पन्न करने वाला है, जो तब तक गणना नहीं की जाएगी जब तक कि यह प्रारंभिक राज्य न हो जाए (यह सभी राज्य कंप्यूटेशन्स में सत्य है जब वे अपने "लिपटे" फ़ॉर्म में हों) इस नई गणना का नतीजा, जो कि बाईं ओर की गई गणना को चलाने के परिणाम के लिए & gt; & gt; =
के दाईं ओर है, जो भी लागू होता है, उसके द्वारा प्राप्त किया जाता है। (यह एक बहुत ही भ्रामक वाक्य है जिसे अतिरिक्त पढ़ने या दो की आवश्यकता हो सकती है।)
मैंने इसे '' desugar '' सब कुछ करने के लिए काफी उपयोगी पाया है जो चल रहा है। ऐसा करने से बहुत ज्यादा टाइपिंग हो जाती है, लेकिन आपको अपने प्रश्न का उत्तर देना चाहिए (जहां से प्राप्त करें
से हो रहा है) बहुत स्पष्ट है ध्यान दें कि निम्नलिखित को psuedocode माना जाना चाहिए ...
test x = राज्य $ \ s - & gt; चलो (ए, एस ') = रनस्टेट (राज्य (\ s - & gt; (एस, एस))) एस - उपरोक्त defn में defn। RunState (rightside a) s में 'get' की 'जहां' सही साइड टेस्ट = टेस्ट करें '= x ++ test in state $ s2 - & gt; (ए 2, एस 2 ') = रनस्टेट (राज्य $ \ _ - & gt; ((), परीक्षण')) s2 - defn RunState (rightside2 a2) s2 में 'put' की 'rightside2 _ = - आदि ...
इसे स्पष्ट करना चाहिए कि हमारे फ़ंक्शन का अंतिम परिणाम एक नई राज्य गणना है बाकी चीजों को होने के लिए प्रारंभिक मान ( s
) की आवश्यकता होगी आपने अपने रनस्टैट
कॉल के साथ s
को "testtest"
प्रदान किया है। यदि आप उपरोक्त स्यूडोकोड में "testtest" का विकल्प बनाते हैं, तो आप देखेंगे कि ऐसा पहली बार होता है कि हम "testtest" के साथ "प्रारंभिक स्थिति" के रूप में चलाते हैं get
'। यह उपज ("testtest", "testtest")
और इतने पर।
ऐसा है कि जहां प्राप्त करें
आपकी प्रारंभिक स्थिति "testtest" हो जाता है आशा है कि यह मदद करता है!
Comments
Post a Comment