
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.