monads - Is mapM in Haskell strict? Why does this program get a stack overflow? -
निम्न प्रोग्राम सही ढंग से समाप्त होता है:
आयात करें सिस्टम। यादृच्छिक यादृच्छिक सूची = mapM (\ _ - & gt; getStdRandom (यादृच्छिक आर (0, 50000 :: इंट))) [0..5000] मुख्य = रैंडम इन्स & lt; - यादृच्छिक सूची प्रिंट $ 5 ले जा रहा है
चल रहा है:
$ runhaskell test.hs [26156,7258,29057,40002,26339]
हालांकि, यह एक अनंत सूची के साथ खिला रहा है, प्रोग्राम समाप्त नहीं होता, और जब संकलित, अंत में एक स्टैक अतिप्रवाह त्रुटि देता है!
आयात सिस्टम। यादृच्छिक यादृच्छिक = सूची = एमएम (\ _- & gt; getStdRandom (यादृच्छिक आर (0, 50000 :: Int)) [0 .. ] Main = do randomInts & lt; - randomList प्रिंट $ ले 5 randomInts
चल रहा है,
$ ./test स्टैक स्पेस अतिप्रवाह: वर्तमान आकार 8388608 बाइट्स इसे बढ़ाने के लिए `+ आरटीएस -केस-आरटीएस 'का उपयोग करें
मुझे हर बार जब मैं सूची से एक आइटम चुनता हूं, तो 5 बार ऐसा करने के बाद समाप्त होने पर मुझे लाज़िली मूल्यांकन करने के लिए कार्यक्रम की उम्मीद है getStdRandom
पूरी सूची का मूल्यांकन करने की कोशिश क्यों कर रही है?
धन्यवाद।
क्या यादृच्छिक संख्याओं की अनंत सूची प्राप्त करने का कोई बेहतर तरीका है? मैं एक शुद्ध समारोह में इस सूची को उत्तीर्ण करना चाहता हूं।
संपादित करें: कुछ और रीडिंग से पता चला है कि फ़ंक्शन
randomList r = do g & lt; - getStdGen $ randomRs आरजी रिटर्न
मैं क्या चाहता था।
EDIT2: कैमकैन के उत्तर को पढ़ने के बाद, मुझे एहसास हुआ कि getStdGen
हर नए बीज मिल रहा है पु का र ना। इसके बजाय, इस फ़ंक्शन को एक साधारण एक-शॉट यादृच्छिक सूची जनरेटर के रूप में उपयोग करने के लिए बेहतर:
आयात करें सिस्टम। यादृच्छिक यादृच्छिक :: रैंडम ए = & gt; ए - & gt; ए - & gt; आईओ [ए] यादृच्छिक सूची आरजी = आई एस & लेफ्टिनेंट; - newStdGen $ यादृच्छिकRs (आर, जी) एस मुख्य = आई आर एंड एलटी; - यादृच्छिक सूची 0 (50 :: आईटी) प्रिंट $ लेने के लिए 5 आर लेकिन मुझे अब भी समझ में नहीं आ रहा है कि मेरा mapM
कॉल समाप्त क्यों नहीं हुआ। स्पष्ट रूप से यादृच्छिक संख्या से संबंधित नहीं है, लेकिन mapM
के साथ ऐसा करने के लिए कुछ।
उदाहरण के लिए, मैंने पाया कि निम्न भी समाप्त नहीं होता है:
< Code> randomList = mapM (\ _- & gt; वापसी 0) [0 ..] मुख्य = रैंडम इन्स & lt; - यादृच्छिक सूची प्रिंट $ 50000 randomInts ले
क्या देता है? वैसे, आईएमएचओ, उपर्युक्त यादृच्छिक अंतर फ़ंक्शन में होना चाहिए
System.Random
। आईओ मोनद में एक यादृच्छिक सूची उत्पन्न करने के लिए और इसे आवश्यक होने पर इसे शुद्ध समारोह में सक्षम बनाने में बहुत ही सुविधाजनक है, मुझे नहीं लगता कि यह मानक पुस्तकालय में क्यों नहीं होना चाहिए। < / P>
मैं इस तरह से कुछ और करूँगा, यादृच्छिक रेंड्स को प्रारंभिक RandomGen के साथ काम करना चाहिए:
#! / Usr / bin / env runhaskell आयात control.Monad आयात प्रणाली। यादृच्छिक यादृच्छिक :: RandomGen जी = & gt; जी - & gt; [इंट] यादृच्छिक सूची = यादृच्छिक आरएस (0, 50000) मुख्य :: आईओ () मुख्य = यादृच्छिक इंच & amp; लिफ्ट - लिफ्ट एम यादृच्छिक: नए लिपटे NewStdGen प्रिंट $ लेने के लिए 5 randomInts
आलस्य के लिए, क्या हो रहा है यह है कि mapM
है (अनुक्रम मानचित्र)
इसका प्रकार है: mapM :: (Monad m) = & gt; (ए - & gt; एम बी) - & gt; [ए] - & gt; एम [बी]
यह फ़ंक्शन का मानचित्रण है, [mb]
देकर और फिर उन सभी कार्यों को m [b] बनाने की जरूरत है
। यह अनुक्रम है जो अनंत सूची के माध्यम से कभी नहीं मिलेगा।
यह पहले प्रश्न के जवाब में बेहतर समझाया गया है:
Comments
Post a Comment