[Haskell-cafe] Getting WriterT log lazily

Magnus Therning magnus at therning.org
Sun May 3 17:17:11 EDT 2009


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

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 197 bytes
Desc: OpenPGP digital signature
Url : http://www.haskell.org/pipermail/haskell-cafe/attachments/20090503/df976534/signature.bin


More information about the Haskell-Cafe mailing list