
The problem is that hGetContents only reads the contents of the file on demand and, without the 'return $!' you don't demand the value until somewhere outside of rechf. By this point the hClose has happened and hGetContents has no access to the file => no lines => no result.
I must be really dumb but I don't get why 'at this point the hClose has happened' It seemed to me that when I typed at ghci's prompt rechf "xxxx" it tries to evaluate it. that makes it perform the IO action of opening the file, then performing the IO action of evaluating ( since I need the result ) rechf2 "xxxx" and *lastly* performing the IO action of closing the file. So to me either I'm just too confused to understand or something doesn't work as it should be. I also tried using readFile ( again following Jeremy's suggestion ) and it works :
rechf r = do f <- readFile "liste" return $ rech r $ lines f