Haskell I / O perezosa y archivos de cierre

He escrito un pequeño programa Haskell para imprimir las sumas de verificación MD5 de todos los archivos en el directorio actual (buscado de forma recursiva). Básicamente una versión de Haskell demd5deep. Todo está bien, excepto si el directorio actual tiene una gran cantidad de archivos, en cuyo caso recibo un error como:

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

Parece que la pereza de Haskell está causando que no cierre los archivos, incluso después de que se haya completado su línea de salida correspondiente.

El código relevante está debajo. La función de interés esgetList.

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.

¿Hay alguna idea sobre cómo podría resolver este problema?

El programa completo está disponible aquí:http://haskell.pastebin.com/PAZm0Dcb

Editar:&nbsp;Tengo muchos archivos que no caben en la RAM, por lo que no estoy buscando una solución que lea todo el archivo en la memoria a la vez.