
I tried this earlier as well: sequenceIO [] = return [] sequenceIO (x : xs) = do result <- x resultTail <- sequenceIO xs return result : resultTail This results in: Couldn't match expected type `IO [a]' against inferred type `[m a]' In the expression: return result : resultTail In the expression: do result <- x resultTail <- sequenceIO xs return result : resultTail In the definition of `sequenceIO': sequenceIO (x : xs) = do result <- x resultTail <- sequenceIO xs return result : resultTail
sequenceIO [] = return [] sequenceIO (x : xs) = do result <- x return result : sequenceIO xs
The problem is indeed here. The type of 'sequenceIO xs' is IO [a], but the type of result is 'a'. You can't cons an 'a' onto an 'IO [a]'. Thus, what you need is something like this: sequenceIO [] = return [] sequenceIO (x : xs) = do result <- x xs' <- sequenceIO xs -- to take the list out of the IO Monad return result : xs'