[Haskell-beginners] lazy IO in readFile

Andrew Sackville-West andrew at swclan.homelinux.org
Wed May 19 21:17:31 EDT 2010


On Sun, May 16, 2010 at 11:03:03PM +1200, Stephen Blackheath [to Haskell-Beginners] wrote:
> Andrew,
> 
> On 15/05/10 11:57, Andrew Sackville-West wrote:
> > I'm having trouble determining how to put this into the existing
> > context of a string of filter's and maps where the contents of the
> > file are used in a predicate to a filter. (if you really want you can
> > look at my ridiculous code at
> > http://git.swclan.homelinux.org/rss2email.git)
> 
> I took a look.  You've got a list of items and you want to check each
> one against your 'seen it' file.  I'm not sure what your requirements
> are but currently the whole file gets read into memory.  So, sticking
> with that, here's _a_ way to do it (with a Set, which gives a faster
> lookup):

yeah, reading it all in is fine. NOt sure in the long term what the
problems are with that. I suppose if it was a really big history file,
it would be important to do something else, but it works for now.

> 
> import Control.Exception
> import Data.Set (Set)
> import qualified Data.Set as S
> import System.IO.Error
> import Prelude hiding (catch)
> 
> 
> -- | Return "seen it" predicate
> readHistory :: FilePath -> IO (String -> Bool)
> readHistory fn = do
>     hist <- withFile fn ReadMode $ \h -> fetchLines h S.empty
>     return (`S.member` hist)
>   where
>     fetchLines h hist = do
>         l <- hGetLine h
>         fetchLines h $! S.insert l hist
>       `catch` \exc ->
>         if isEOFError exc
>             then return hist
>             else throwIO exc
> 
> This is completely strict.  The $! is there to make sure we're keeping a
> set in memory, not a chain of inserts (though the inserts wouldn't
> actually take up any more memory than the set does).  I haven't tried
> compiling this.

thanks for this. it helps a lot. hmmm... I wonder why it is I never
have a problem returning functions in Scheme, but it never occurs to
me as I learn Haskell? 

thanks for your help.

A
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
Url : http://www.haskell.org/pipermail/beginners/attachments/20100519/f1b4d9ff/attachment.bin


More information about the Beginners mailing list