How about this: > type ActionLog v = Writer [IO v]
> myTell :: v -> ActionLog v () > myTell a = tell [sleep 1 >> return a] > foo :: ActionLog Int () > foo = mapM_ myTell [1..10] > main = sequence_ results where > (_, vals) = runWriter foo > results = map (>>= print) vals -- ryan On Sun, May 3, 2009 at 2:17 PM, Magnus Therning <mag...@therning.org> wrote: > I've been playing around with (WriterT [Int] IO), trying to get the log > out and map `print` over it... and do it lazily. However, I'm not > really happy with what I have so far, since I've had to resort to > `unsafePerformIO`. Any hints are welcome. > > What I have so far is: > > foo = let > _tell i = do > a <- return $ unsafePerformIO $ sleep 1 > tell [a + 1 `seq` i] > in do > mapM_ _tell [1..10] > > main = do > (_, ~res) <- runWriterT foo > mapM_ print res > > Without the `seq` the call to sleep will simply be skipped (is there an > easier way to force evaluation there?). Without `unsafePerformIO` all > the sleeping is done up front, and all numbers are print at once at the > end. > > The goal is of course to use code along the same shape to do something more > useful, and then `unsafePerformIO` will really be unsafe... > > /M > > -- > Magnus Therning (OpenPGP: 0xAB4DFBA4) > magnus@therning.org Jabber: magnus@therning.org > http://therning.org/magnus identi.ca|twitter: magthe > > > _______________________________________________ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe > > _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe