मुझे एक सूची मोनैड ट्रांसफॉर्मर का उपयोग करने की आवश्यकता है। मैंने पढ़ा है कि Control.Monad.List
से संभावित समस्याएं हैं, क्योंकि IO
कम्यूटिव नहीं है, इसलिए मैं ListT done right देख रहा हूं। लेकिन मुझे कुछ अप्रत्याशित व्यवहार मिल रहा है।सूची मोनड ट्रांसफार्मर
यह साधारण परीक्षण पर विचार करें:
test = runListT $ do
x <- liftList [1..3]
liftIO $ print x
y <- liftList [6..8]
liftIO $ print (x,y)
Control.Monad.List का उपयोग करना:
Main> test
1
(1,6)
(1,7)
(1,8)
2
(2,6)
(2,7)
(2,8)
3
(3,6)
(3,7)
(3,8)
[(),(),(),(),(),(),(),(),()]
का उपयोग करना "ListT सही किया":
Main> test
1
(1,6)
इस के साथ एक समस्या है " ListT सही किया ", या मैं बस इसे गलत इस्तेमाल कर रहा हूँ? क्या कोई पसंदीदा विकल्प है?
धन्यवाद!
हम्म, ठीक है, यह समझ में आता है, और आपका 'runAll_' विचार काफी अच्छा है! मैं एक अनिवार्य भाषा में प्रिंट स्टेटमेंट के साथ loops के लिए घोंसला के समान व्यवहार की उम्मीद कर रहा था। लेकिन अगर "लिस्टटी सही किया गया" आलसी है, तो यह अभी भी सूचियों के प्रमुखों के लिए दुष्प्रभाव क्यों कर रहा है? –
यह मानते हुए कि आप हमेशा कम से कम पहला तत्व चाहते हैं, इसलिए यह 'एम' में "पूरी सूची" को लपेटता है, और सीडीआर को 'एम' में लपेटता है; कार लपेटा नहीं है। यदि आप "पूरी सूची" अनुक्रमित करते हैं, तो यह केवल कार को उजागर करता है। – Owen