2012-03-15 13 views
14

मुझे एक सूची मोनैड ट्रांसफॉर्मर का उपयोग करने की आवश्यकता है। मैंने पढ़ा है कि 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 सही किया ", या मैं बस इसे गलत इस्तेमाल कर रहा हूँ? क्या कोई पसंदीदा विकल्प है?

धन्यवाद!

उत्तर

8

इस लेखक की ओर से intensional हो सकता है, के बाद से वे कहते हैं

यह सुविधा देता है सूची के प्रत्येक तत्व का अपना दुष्प्रभाव है, जो केवल करने के `excecuted 'अगर है सूची के इस तत्व वास्तव में निरीक्षण किया जाता है।

मुझे यकीन नहीं है, हालांकि। वैसे भी, आप पूरे सूची क्रम को इस सुविधा का उपयोग कर सकते हैं:

runAll_ :: (Monad m) => ListT m a -> m() 
runAll_ (ListT m) = runAll_' m where 
    runAll_' m = do 
     mm <- m 
     case mm of 
      MNil   -> return() 
      _ `MCons` mxs -> runAll_' mxs 

और एक अनुरूप runAll कि रिटर्न सूची का निर्माण करने के लिए आसान होना चाहिए।

main = runAll_ $ do 
    x <- liftList [1..3] 
    liftIO $ print x 
    y <- liftList [6..8] 
    liftIO $ print (x,y) 

1 
(1,6) 
(1,7) 
(1,8) 
2 
(2,6) 
(2,7) 
(2,8) 
3 
(3,6) 
(3,7) 
(3,8) 
+0

हम्म, ठीक है, यह समझ में आता है, और आपका 'runAll_' विचार काफी अच्छा है! मैं एक अनिवार्य भाषा में प्रिंट स्टेटमेंट के साथ loops के लिए घोंसला के समान व्यवहार की उम्मीद कर रहा था। लेकिन अगर "लिस्टटी सही किया गया" आलसी है, तो यह अभी भी सूचियों के प्रमुखों के लिए दुष्प्रभाव क्यों कर रहा है? –

+0

यह मानते हुए कि आप हमेशा कम से कम पहला तत्व चाहते हैं, इसलिए यह 'एम' में "पूरी सूची" को लपेटता है, और सीडीआर को 'एम' में लपेटता है; कार लपेटा नहीं है। यदि आप "पूरी सूची" अनुक्रमित करते हैं, तो यह केवल कार को उजागर करता है। – Owen

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