2014-09-21 3 views
10

मैं Haskell course by Brent Yorgey के माध्यम से काम करके हास्केल सीख रहा हूं। मैं बस मोनैड सेक्शन पर पहुंचा, और जब मुझे लगता है कि मैं (आखिरकार) मोनैड के साथ काम करने के बारे में एक सभ्य समझ है, तो मुझे समझ में नहीं आता कि कोड का परीक्षण कैसे किया जाए।परीक्षण मोनाडिक कोड

इस खंड का अभ्यास एक (सरलीकृत) जोखिम सिमुलेशन लिखना है, और इसके लिए Rand StdGen मोनड का भारी उपयोग की आवश्यकता है। विशेष रूप से, हमें निम्नलिखित फ़ंक्शन लिखना होगा:

type Army = Int 

data Battlefield = Battlefield { attackers :: Army, defenders :: Army } 

battle :: Battlefield -> Rand StdGen Battlefield 

यह प्रारंभिक युद्धक्षेत्र लेता है, और यह लड़ाई कैसे चलती है इसका सिमुलेशन चलाता है।

मेरे पास इसके लिए एक कार्यान्वयन है, लेकिन मुझे समझ में नहीं आता कि इसका परीक्षण कैसे किया जाए। मैं Rand StdGen Battlefield के अंदर battle द्वारा लौटाए गए मानों को "प्राप्त नहीं कर सकता", इसलिए मैं उन्हें जीएचसीआई दुभाषिया पर प्रिंट नहीं कर सकता, इस प्रकार मैं अब तक अपने कोड का परीक्षण कर रहा हूं। मैं यह भी नहीं समझ सकता कि हास्केल मुख्य फ़ंक्शन, या किसी चीज़ में युद्ध के परिणाम को कैसे मुद्रित किया जाए। लोग इस तरह के कार्यों का परीक्षण करने के बारे में कैसे जाते हैं?

+4

आप ['evalRand'] (http://hackage.haskell.org/package/MonadRandom-0.1.3/docs/Control-Monad-Random जैसे कार्यों का उपयोग करके यादृच्छिक गणना के परिणाम" प्राप्त "कर सकते हैं। एचटीएमएल) और दोस्तों। 'evalRand'' प्रारंभ '' RandomGen' लेता है और दृढ़ता से monadic गणना चलाता है। –

+1

बहुत बढ़िया, धन्यवाद! यदि आप इसे उत्तर के रूप में पोस्ट करते हैं, तो मैं इसे स्वीकार करूंगा। – anjruu

उत्तर

10

evalRand और दोस्तों जैसे कार्यों का उपयोग करके आप यादृच्छिक गणना के परिणाम "प्राप्त" कर सकते हैं। evalRandRandomGen 'शुरू' लेता है और दृढ़ता से monadic गणना चलाता है।


यहाँ मेरी हाथ लहराते, क्या evalRand के लिए है की गैर कठोर व्याख्या दी गई है:

monads और जरूरी प्रोग्रामिंग के बीच मतभेद से एक है कि एक इकाई के एक गणना की एक प्रतिनिधित्व है, नहीं गणना स्वयं। दूसरे शब्दों में, जब हास्केल a >>= b >>= c (या समतुल्य do नोटेशन) की अभिव्यक्ति का मूल्यांकन करता है, तो यह सिर्फ लेगो ईंटों को एक साथ रखता है, इसलिए बोलने के लिए - गणना निष्पादित करें, evalRand जैसे फ़ंक्शन का उपयोग करके मोनैड निष्पादित करें ।

एक सरल उदाहरण के लिए, कार्यों को एक साथ लिखने के बारे में सोचें। . आपको एक ऐसा फ़ंक्शन देता है जो इसे दो कार्यों द्वारा किए गए गणना के प्रतिनिधित्व का प्रतिनिधित्व करता है। जब आप वास्तव में किसी तर्क के साथ फ़ंक्शन को कॉल करते हैं तो आपको केवल उस गणना से वापसी मूल्य मिलता है।

यही कारण है कि मानक पुस्तकालय में कई मोनैड (IO के अपवाद के साथ, जिसे रन-टाइम सिस्टम द्वारा निष्पादित किया जाता है) evalRand जैसे "जाल दरवाजा" फ़ंक्शन प्रदान करते हैं। यह वास्तव में आप का उपयोग करते हैं जो गणना आपने अभी अपने मोनैडिक कोड में परिभाषित की है।

+4

यह बहुत सारे मोनैड के बारे में सोचने का एक उपयोगी तरीका है, लेकिन यह आम तौर पर मोनैड के बारे में सच नहीं है। जब तक आप "जाल दरवाजा" फ़ंक्शन (आलस्य के कारण छोड़कर) को कॉल नहीं करते हैं, तब तक सूची मोनैड गणना को स्थगित नहीं करती है। यह केवल मोनैड है जो किसी प्रकार के पर्यावरण के लिए अंतर्निहित पहुंच प्रदान करता है जो आपके द्वारा वर्णित तरीके से काम करता है, और ऐसा इसलिए है क्योंकि उदा। एक 'रैंड स्टडजेन इंट' एक "संभाव्य पूर्णांक" का प्रतिनिधित्व करता है, जिसे सभी मूल्यों से एक ठोस 'Int' चुनने के लिए' StdGen' प्रदान करने की आवश्यकता होती है। – Ben

+1

आप बिल्कुल सही हैं। टिप्पणी के लिए धन्यवाद। यह मेरे गुणात्मक वर्णन के लिए कुछ महत्वपूर्ण संदर्भ और संतुलन प्रदान करता है। –

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