2010-04-04 8 views
12

मैं रियल वर्ल्ड हास्केल (अध्याय 14) में मोनाड्स अध्याय पढ़ रहा हूं।मोनाडस्टेट का कारण मिलता है और डाल दिया जाता है?

type RandomState a = State StdGen a 
getRandom :: Random a => RandomState a 
getRandom = 
    get >>= \gen -> 
    let (val, gen')= random gen in 
    put gen' >> 
    return val 

मैं वास्तव में प्राप्त करने के उद्देश्य को समझने और कार्यों को यहाँ रखा नहीं है: एक समारोह defined इस प्रकार है।

getRandom2 :: Random a => RandomState a 
getRandom2= State $ \ s -> random s 

तो मेरे सवाल है: क्या की हो और सामान्य में डाल उद्देश्य है मैं जो और एक ही बात कर रहा है अधिक संक्षिप्त है निम्नलिखित के रूप में कार्य दुबारा लिखा?

+1

बस इस मामले में, या सामान्य रूप से 'get' और' put' का उद्देश्य? बाद के मामले में उनके उपयोग को आसानी से समझाया जा सकता है ... – kennytm

+0

सामान्य रूप से; मैं अपना प्रश्न संपादित करूंगा। – CiscoIPPhone

उत्तर

12

यह एक संयोग का एक सा है कि randomState इकाई के भीतरी समारोह के रूप में वास्तव में एक ही प्रकार के हस्ताक्षर/उपयोग पैटर्न के लिए होता (और वास्तव में इस मामले में आप और भी अधिक संक्षिप्त, अगर शायद अधिक भ्रमित हो सकते हैं getRandom2 = State random के साथ)।

हालांकि, आमतौर पर लागू नहीं होगा, और फिर get और put सुविधाजनक नलसाजी टुकड़े हैं जिनका अर्थ सीधे आंतरिक कार्य को लिखने से स्पष्ट है। वे State द्वारा उपयोग किए जाने वाले सटीक प्रतिनिधित्व से सार करने में भी मदद करते हैं - वे वास्तव में अधिक सामान्य श्रेणी MonadState के वर्ग सदस्य हैं, इसलिए आप उनका उपयोग करके अधिक पॉलीमोर्फिक कोड लिख सकते हैं।

+0

मेरे पास एक और सवाल है - अगली कॉल के लिए * डाल * नया राज्य कैसे रखें? * Put * के आउटपुट को अनदेखा किया जाता है, मैं इसे समझ नहीं सकता। कृपया मेरी मदद करें। धन्यवाद। –

+0

वह 'राज्य' मोनैड की आंतरिक नलसाजी का हिस्सा है। 'Put' का monadic आउटपुट यह इंगित करने के लिए'() 'प्रकार का है कि यह एक उपयोगी मूल्य नहीं है। उत्तर के लिए –

+0

Thx। लेकिन मैं पूरी तरह से समझ में नहीं आता। क्या इसका मतलब है * डाल * कुछ साइड इफेक्ट है? क्या आप समझा सकते हैं कि यह कैसे नया राज्य स्टोर करता है? धन्यवाद। –

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