[Haskell-cafe] Strictness leak

Jeff Polakow jeff.polakow at db.com
Tue Oct 30 15:04:14 EDT 2007


Hello,

> > countIO :: String -> String -> Int -> [a] -> IO [a]
> > countIO msg post step xs = sequence $ map unsafeInterleaveIO 
> ((blank >> outmsg (0::Int) >> c):cs)
> >    where (c:cs) = ct 0 xs
> >          output   = hPutStr stderr
> >          blank    = output ('\r':take 70 (repeat ' '))
> >          outmsg x = output ('\r':msg++show x) >> hFlush stderr
> >          ct s ys = let (a,b) = splitAt (step-1) ys
> >                        next  = s+step
> >                    in case b of [b1] -> map return a ++ [outmsg 
> (s+step) >> hPutStr stderr post >> return b1]
> >                                 []   -> map return (init a) ++ 
> [outmsg (s+length a) >> hPutStr stderr post >> return (last a)]
> >                                 _ -> map return a ++ [outmsg s >> 
> return (head b)] ++ ct next (tail b)
> 
> It wraps a list with IO operations, so that progress can be reported
> while evaluating the list elements.  Unfortunately, there seems to be
> a "stricness leak" here - and consequently, it does not work on an
> infinite list. 
> 
Besides anything else, sequence will diverge on an infinite list. This can 
be seen directly from the type:

    sequence :: Monad m => [m a] -> m [a] 

It is necessary to compute all of the computations in the list before 
returning any of the pure resulting list.

-Jeff


---

This e-mail may contain confidential and/or privileged information. If you 
are not the intended recipient (or have received this e-mail in error) 
please notify the sender immediately and destroy this e-mail. Any 
unauthorized copying, disclosure or distribution of the material in this 
e-mail is strictly forbidden.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20071030/68beb5ff/attachment.htm


More information about the Haskell-Cafe mailing list