
This is somewhat related: http://ghc.haskell.org/trac/ghc/ticket/4219
This also solves the concrete problem you gave in your original post
(in reverse order):
import Control.Monad
import System.Random
sequencel :: Monad m => [m a] -> m [a]
sequencel = foldM (\tail m -> (\x -> return $ x : tail) =<< m) []
main :: IO ()
main = print =<< sequencel (replicate 1000000 (randomIO :: IO Integer))
Following on Reid's point, maybe it's worth noting in the
documentation that replicateM, mapM, and sequence are not tail
recursive for Monads that define (>>=) as strict in the first
argument?
On Tue, Aug 27, 2013 at 6:07 AM, Niklas Hambüchen
On 27/08/13 20:37, Patrick Palka wrote:
You can use ContT to force the function to use heap instead of stack space, e.g. runContT (replicateM 1000000 (lift randomIO)) return
That is interesting, and works.
Unfortunately its pure existence will not fix sequence, mapM etc. in base.
_______________________________________________ Libraries mailing list Libraries@haskell.org http://www.haskell.org/mailman/listinfo/libraries
-- Love in Jesus Christ, John Alfred Nathanael Chee http://www.biblegateway.com/ http://web.cecs.pdx.edu/~chee/