Haskell IO和带递归的数组

fun*_*ial 1 arrays io recursion haskell functional-programming

我在编写类型
Int -> IO [Int]或函数时遇到问题Int -> [IO Int]

我有以下代码不起作用:

createEIList :: Int -> IO [Int]
createEIList len = do
    cur <- createEI
    (return cur):(createEIList (len-1))
Run Code Online (Sandbox Code Playgroud)

createEI的位置 createEI :: IO Int

做这样的事情的最佳方法是什么?

Dan*_*zer 5

使它接近你原来的

createEIList :: Int -> IO [Int]
createEIList len = do
    cur <- createEI
    rest <- createEIList (len-1)
    return (cur:rest)
Run Code Online (Sandbox Code Playgroud)

这样,您不会尝试附加IO Int到列表中,而是返回整个列表,将您提升[Int]IO [Int]

你也可能想要一个基础案例

createEIList 0 = return []
createEIList n = ...
Run Code Online (Sandbox Code Playgroud)

这样递归实际上终止了.

另外值得注意的是,您可以使用组合器删除显式递归

 replicateM :: Int -> IO a -> IO [a] -- Restricted for clarity
Run Code Online (Sandbox Code Playgroud)

我会留给你弄清楚如何使用它.