Yet another weakly defined bug report
Ketil Z. Malde
ketil@ii.uib.no
13 Feb 2003 11:39:23 +0100
"Simon Marlow" <simonmar@microsoft.com> writes:
> > > -- | add data from a file to the histogram
> > > addFile :: FiniteMap String Int -> String -> IO (FiniteMap
> > String Int)
> > > addFile fm name = do
> > > x <- readFile name
> > > return (addHist fm x)
> > >
> > > -- | add data from all files in a directory to the histogram
> > > addDir :: FiniteMap String Int -> String -> IO (FiniteMap
> > String Int)
> > > addDir fm dir = do
> > > dc <- getDirectoryContents dir
> > > fs <- filterM doesFileExist (map ((dir++"/")++) dc)
> > > foldM addFile fm fs
> It's not possible to tell from this code whether the readFiles will be
> fully evaluated or not: it depends on how much evaluation addHist does,
> and to what extend the result FiniteMap is demanded, amongst other
> things.
Of course. Never cut code, I suppose; I thought the parts my
understanding would be weakest would be the monadic stuff, not this:
> addHist :: FiniteMap String Int -> String -> FiniteMap String Int
> addHist fm = foldl add1 fm . words
> where add1 f w =
> case lookupFM f w of
> Just n -> addToFM f w (n+1)
> Nothing -> addToFM f w 1
I felt pretty sure that this would evaluate the string to the end. Am
I wrong?
> These things are always tricky to understand, which is why I recommend
> not using lazy I/O. File reading is not a pure operation: running out
> of file descriptors is a good counter-example.
Okay. Perhaps renaming "readFile" to "unsafeReadFile"? :-)
-kzm
--
If I haven't seen further, it is by standing in the footprints of giants