[Haskell-beginners] lazy IO by example

Dean Herington heringtonlacey at mindspring.com
Sat Feb 5 05:42:16 CET 2011


At 1:29 PM +0100 2/4/11, Tim Baumgartner wrote:
>Hi community,
>
>In the following code, the main function only wants to print the 
>first 5 numbers of a huge list. But since the computation is not 
>lazy, this doesn't work in a satisfactory way.
>
>
>
>content :: Int -> IO [Int]
>content i = do
>   fs  <- files i
>   ds  <- directories i
>   fss <- mapM content ds
>   return $ fs ++ concat fss
>
>files i = return [1..i]
>
>
>directories i = return [1..i-1]
>
>main = content 1000000 >>= print . take 5
>
>
>Now I'd like to know if it's possible to make this "IO" lazy, using 
>unsafeInterleaveIO. I tried to do it, failed. Perhaps someone can 
>help.

In your simplified example, it suffices to wrap unsafeInterleaveIO 
around (mapM content ds).  In a more realistic case, you'd need to 
add some `unsafeInterleaveIO`s in `files` and `directories`, too.

Dean

P.S. You might also want to look into iteratees, which accomplish a 
similar goal in a more robust way.

>
>I guess another weakness of this code is the bad performance of "dfs 
>++ concat fss", but currently I don't care about that.
>
>Thanks for any help
>Tim
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20110204/70a63184/attachment.htm>


More information about the Beginners mailing list