Haskell ленивый ввод-вывод и закрытие файлов

Я написал небольшую программу на Haskell для печати контрольных сумм MD5 для всех файлов в текущем каталоге (рекурсивный поиск). В основном версия на Haskellmd5deep, Все хорошо, за исключением случаев, когда в текущем каталоге очень большое количество файлов, и в этом случае я получаю сообщение об ошибке:

<program>: <currentFile>: openBinaryFile: resource exhausted (Too many open files)

Кажется, лень Хаскелла заставляет его не закрывать файлы, даже после завершения соответствующей строки вывода.

Соответствующий код ниже. Функция интересаgetList.

import qualified Data.ByteString.Lazy as BS

main :: IO ()
main = putStr . unlines =<< getList "."

getList :: FilePath -> IO [String]
getList p =
    let getFileLine path = liftM (\c -> (hex $ hash $ BS.unpack c) ++ " " ++ path) (BS.readFile path)
    in mapM getFileLine =<< getRecursiveContents p

hex :: [Word8] -> String
hex = concatMap (\x -> printf "%0.2x" (toInteger x))

getRecursiveContents :: FilePath -> IO [FilePath]
-- ^ Just gets the paths to all the files in the given directory.

Есть какие-нибудь идеи о том, как мне решить эту проблему?

Вся программа доступна здесь:http://haskell.pastebin.com/PAZm0Dcb

Редактировать: У меня много файлов, которые не помещаются в ОЗУ, поэтому я не ищу решение, которое считывает весь файл в память сразу.

Ответы на вопрос(7)

Ваш ответ на вопрос