Fwd: [Haskell-cafe] hGetContents and lazyness

---------- Forwarded message ----------
From: Rafael Gustavo da Cunha Pereira Pinto
getPackageList packageFile = do h <- OpenFile packageFile ReadMode c <- hGetContents h return $ map (drop 10) $ filter (startsWith "Filename:") $ lines c
I am not at home so I don't have GHC around here, but this usually works for
me!
Anyway, it also depends on who is consuming the IO [FilePath] data returned.
It will not be evaluated unless asked for!
On Mon, Sep 22, 2008 at 14:52, Max Vasin
Hello, haskellers!
Suppose we have function (it filters package filenames from apt Packages file):
getPackageList :: FilePath -> IO [FilePath] getPackageList packageFile = withFile packageFile ReadMode $ \h -> do c <- hGetContents h return $ map (drop 10) $ filter (startsWith "Filename:") $ lines c -- (1) where startsWith [] _ = True startsWith _ [] = False startsWith (x:xs) (y:ys) | x == y = startsWith xs ys | otherwise = False
When, I apply it to a Packages file I (surely) get an empty list. This is an expected result due to lazyness of hGetContents. I tried changing line (1) to
return $ map (drop 10) $ filter (startsWith "Filename:") $! lines c
or
return $ map (drop 10) $! filter (startsWith "Filename:") $! lines c
with no success.
Chaning it to
return $! map (drop 10) $ filter (startsWith "Filename:") $ lines c
makes getPackageList function return several (but not all) filenames.
What I'm missing? And how can I fix my code?
-- WBR, Max Vasin.
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
-- Rafael Gustavo da Cunha Pereira Pinto Electronic Engineer, MSc. -- Rafael Gustavo da Cunha Pereira Pinto Electronic Engineer, MSc.
participants (1)
-
Rafael Gustavo da Cunha Pereira Pinto