
It seems like the line numbers could be a bit more accurate:
./Network/Yogurt/IO.hs:54:3: Use liftM Found: rec >>= return . (c :) Why not: liftM (c :) rec
Where the code is:
50 -- Waits for input, but once the first character is read, waits 51 -- no longer than the specified number of ms before giving up. 52 hGetImpatientLine :: Handle -> Int -> IO String 53 hGetImpatientLine h patience = rec where 54 rec = do 55 c <- hGetChar h 56 if c == '\n' 57 then return [c] 58 else do 59 b <- hWaitForInput h patience 60 if b 61 then rec >>= return . (c:) 62 else return [c]
I imagine it could have told me to look at line 61 right away.
You can blame HSE in this case, it only stores line numbers for certain constructs, and expressions are not among them. The closest predictable construct for this case is the RHS of the function definition, which is why you get line 54. This is something I hope to improve in HSE over time. Cheers, /Niklas