Stefan O'Rear wrote:
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
In a moment of insanity, I discounted reverse because I thought it had linear
stack usage, but of course it can be written (and is) to use only linear heap.
You're quite right, sorry for unnecessarily suggesting the use of
unsafePerformIO :-)
Simon
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe