[Haskell-cafe] How do I get this done in constant mem?

mf-hcafe-15c311f0c at etc-network.de mf-hcafe-15c311f0c at etc-network.de
Sat Oct 10 16:14:38 EDT 2009


On Sat, Oct 10, 2009 at 09:33:52AM -0700, Thomas Hartman wrote:
> To: Luke Palmer <lrpalmer at gmail.com>
> Cc: mf-hcafe-15c311f0c at etc-network.de, haskell-cafe at haskell.org
> From: Thomas Hartman <tphyahoo at gmail.com>
> Date: Sat, 10 Oct 2009 09:33:52 -0700
> Subject: Re: [Haskell-cafe] How do I get this done in constant mem?
> 
> > Yes, you should not do this in IO.  That requires the entire
> > computation to finish before the result can be used.
> 
> Not really the entire computation though... whnf, no?

In that example, yes.  But readFile takes the entire file into a
strict String before it gives you the first Char, right?  (Sorry again
for my misleading code "simplification".)

> main = do
>   let thunks :: IO [Int]
>   thunks = (sequence . replicate (10^6) $ (randomRIO (0,10^9)))
>   putStrLn . show . head =<< thunks -- prints
>   putStrLn . show . last =<< thunks -- overflows

Meaning that the entire list needs to be kept?  Is there a reason
(other than "it's easier to implement and it's legal" :-) why the
elements that have been traversed by "last" can't be garbage
collected?



-m


More information about the Haskell-Cafe mailing list