On Thu, May 17, 2007 at 11:22:34AM +0100, Simon Marlow wrote:
> sequence still isn't tail-recursive, although sequence_ is.  If you want a 
> tail-recursive sequence, the only way to do it is like this:
> 
> sequence' :: [IO a] -> IO [a]
> sequence' ms = do
>   let as = map unsafePerformIO ms
>   foldr seq (return ()) as
>   return as

sequence :: Monad m => [m a] -> m [a]
sequence ms = reverse `liftM` sequence' [] ms

sequence' l [] = return l
sequence' l (m:ms) = m >>= \x -> sequence' (x:l) ms

Stefan
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to