हास्केल आईओ और रिकर्सन के साथ सरणी

I am having trouble writing a function with type
Int -> IO [Int] or Int -> [IO Int]

मेरे पास निम्न कोड है जो काम नहीं कर रहा है:

createEIList :: Int -> IO [Int]
createEIList len = do
    cur <- createEI
    (return cur):(createEIList (len-1))

Where createEI is createEI :: IO Int

ऐसा कुछ करने का सबसे अच्छा तरीका क्या है?

0
जोड़ा
विचारों: 1
replicateM :: मोनाड एम => Int -> एम ए -> एम [ए], इस प्रकार का अध्ययन करें
जोड़ा लेखक The Internet, स्रोत

3 उत्तर

createEIList :: Int -> IO Int    
createEIList len = createEI >>= return . replicate len

या

createEIList :: Int -> IO Int  
createEIList len = createEI >>= replicateM len . return

बेहतर समाधान:

createEIList :: Int -> IO Int
createEIList len = replicateM len createEI

tersest:

createEIList :: Int -> IO Int
createEIList = flip replicateM createEI

अनुप्रयोगी:

impयाt Control.Applicative
createEIList  len = replicate <$> pure len <*> createEI
createEIList' len = liftA2 replicate (pure len) createEI
0
जोड़ा

इसे मूल रूप से आपके पास रखने के लिए

createEIList :: Int -> IO [Int]
createEIList len = do
    cur <- createEI
    rest <- createEIList (len-1)
    return (cur:rest)

This way, you don't try to append IO Int to your list, but rather return the whole list lifting your [Int] to an IO [Int]

आप शायद आधार मामला भी चाहते हैं

createEIList 0 = return []
createEIList n = ...

ताकि रिकर्सन वास्तव में समाप्त हो।

यह भी ध्यान देने योग्य है कि आप संयोजक के साथ स्पष्ट रिकर्सन को हटा सकते हैं

 replicateM :: Int -> IO a -> IO [a] -- Restricted for clarity

इसका उपयोग करने के तरीके को समझने के लिए मैं इसे आपको छोड़ दूंगा।

0
जोड़ा
लेकिन : में Int प्रकार का बायां तर्क नहीं होगा और IO Int का सही तर्क होगा?
जोड़ा लेखक functorial, स्रोत
प्रतिकृति एम के लिए +1
जोड़ा लेखक The Internet, स्रोत
@ user2529202 फिक्स्ड, आप इसे अपने मोनाडिक रैपर को हटाने के लिए इसे नाम से स्पष्ट रूप से बांधते हैं
जोड़ा लेखक jozefg, स्रोत

The last line should be createEIList (len-1) >>= \a -> return (cur:a)

0
जोड़ा
@ डेव मुझे लगता है कि अगर आप लंबाई 0 यानी के लिए कोई मामला जोड़ते हैं तो यह होगा। createEIList 0 = वापसी [] ?
जोड़ा लेखक functorial, स्रोत
यह समाप्त नहीं होता है।
जोड़ा लेखक The Internet, स्रोत
मुझे लगता है कि लैम्बडा के बजाय do -notation से चिपकना बेहतर होगा, क्योंकि हम पहले से ही इसमें हैं।
जोड़ा लेखक Nikita Volkov, स्रोत
लैम्ब्डा के बिना - createEIList (लेन -1) >> = वापसी। (cur:)
जोड़ा लेखक viorior, स्रोत
मैं यह सुनिश्चित करना चाहता था कि पूरी चीज को फिर से लिखने या भ्रम पैदा करने के जोखिम के बजाय मैं एक पंक्ति में जवाब दे सकता हूं।
जोड़ा लेखक randomusername, स्रोत